Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Определить в ДМЛ-триггере название таблицы, на которую повешен триггер / 25 сообщений из 25, страница 1 из 1
03.04.2008, 18:08
    #35233925
триггер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
Ку!

Как определить в ДМЛ-триггере название таблицы, на которую повешен триггер?
...
Рейтинг: 0 / 0
03.04.2008, 18:13
    #35233946
Jannny
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
В момент создания триггера запишите константу
...
Рейтинг: 0 / 0
03.04.2008, 18:15
    #35233953
триггер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
JannnyВ момент создания триггера запишите константу
Это конечно вариант :), но может есть что-то типа dictionary_obj_name для ddl-триггера?
...
Рейтинг: 0 / 0
03.04.2008, 18:21
    #35233964
jan2ary
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
Поиском по all_triggers.trigger_body на наличие в теле какой-нибудь абракадабры. Поскольку проверка абракадабры требует наличия ее в теле, то она же и будет маркером.
Во как я придумал (наверняка есть способ попроще :) )
...
Рейтинг: 0 / 0
03.04.2008, 18:28
    #35233993
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
ТриггерЭто конечно вариант :)
Это не "конечно вариант", а "правильный вариант".

Триггер но может есть что-то типа dictionary_obj_name для ddl-триггера?
И какой в этом смысл? "Таблица, на которой повешен триггер" - идеологическая константа. Для написания кода руками она нафиг не нужна, для всяких автогенерируемых стандартных прибамбасов ее тривиально засунуть именно в виде константы.
...
Рейтинг: 0 / 0
03.04.2008, 18:28
    #35233996
dmidek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
Триггер JannnyВ момент создания триггера запишите константу
Это конечно вариант :), но может есть что-то типа dictionary_obj_name для ddl-триггера?

В all_triggers есть и table_owner и table_name.
Но змея кусает себя за хвост.
Вам нужно в триггере узнать имя триггера , для того,
чтобы узнать таблицу. :-)

Я когда то давно где то показывал вариант с использованием
format_call_stack с клеянием и резанием, но это все пустое.
Вариант Jannny самый адекватный. Когда Вы пишете текст триггера
Вы знаете и его имя, и таблицу, на которой он висит...
...
Рейтинг: 0 / 0
03.04.2008, 19:08
    #35234120
Goldminer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
jan2aryПоиском по all_triggers.trigger_body на наличие в теле какой-нибудь абракадабры. Поскольку проверка абракадабры требует наличия ее в теле, то она же и будет маркером.
Во как я придумал (наверняка есть способ попроще :) )
Осталось обеспечить уникальность абракадабр...
...
Рейтинг: 0 / 0
03.04.2008, 19:13
    #35234130
RA\/EN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
dmidek Триггер JannnyВ момент создания триггера запишите константу
Это конечно вариант :), но может есть что-то типа dictionary_obj_name для ddl-триггера?

В all_triggers есть и table_owner и table_name.
Но змея кусает себя за хвост.
Вам нужно в триггере узнать имя триггера , для того,
чтобы узнать таблицу. :-)

Я когда то давно где то показывал вариант с использованием
format_call_stack с клеянием и резанием, но это все пустое.
Вариант Jannny самый адекватный. Когда Вы пишете текст триггера
Вы знаете и его имя, и таблицу, на которой он висит...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
SQL> create table tab_old(id NUMBER);
 
Table created

SQL> create trigger t_to before insert on tab_old begin dbms_output.put_line('I''m on TAB_OLD!'); end;
   2   /
 
Trigger created
 
SQL> set serveroutput on
SQL> insert into tab_old values( 1 );
 
I'm on TAB_OLD!
 
1 row inserted
 
==>SQL> alter table tab_old rename to tab_new;
 
Table altered
 
SQL> insert into tab_new values(1);
 
==>I'm on TAB_OLD!
 
 1  row inserted
 
SQL> 
Воросы?
...
Рейтинг: 0 / 0
03.04.2008, 19:15
    #35234139
RA\/EN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
RA\/ENВоросы?
Гадский парсер...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
SQL> create table tab_old(id NUMBER);
 
Table created

SQL> create trigger t_to before insert on tab_old begin dbms_output.put_line('I am on TAB_OLD!'); end;
   2   /
 
Trigger created
 
SQL> set serveroutput on
SQL> insert into tab_old values( 1 );
 
I am on TAB_OLD!
 
 1  row inserted
 
SQL> alter table tab_old rename to tab_new;
 
Table altered
 
SQL> insert into tab_new values( 1 );
 
I am on TAB_OLD!
 
 1  row inserted
 
SQL> 
...
Рейтинг: 0 / 0
03.04.2008, 19:22
    #35234157
ГостЪ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
RA\/EN
Воросы?

Да только один, зачем триггеру знать имя своей таблички, мож пустая суета это все :)
...
Рейтинг: 0 / 0
03.04.2008, 19:31
    #35234185
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
RA\/ENВоросы?
1. Покажете то же самое в нормальной технологической цепочке, а не на тестовом примере? Нормальная цепочка - это в смысле "проектировщик переименовывает таблицу в CASE инструменте..."
...
Рейтинг: 0 / 0
03.04.2008, 19:44
    #35234210
RA\/EN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
softwarer RA\/ENВоросы?
1. Покажете то же самое в нормальной технологической цепочке, а не на тестовом примере? Нормальная цепочка - это в смысле "проектировщик переименовывает таблицу в CASE инструменте..."
Тривиально - попытки поиметь нечто вроде секционированной таблицы на SE. В данном случае это было бы частью exchange partition. Аргумент "EE - дорого" оправдывает такой подход.
...
Рейтинг: 0 / 0
03.04.2008, 19:55
    #35234238
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
RA\/EN softwarer1. Покажете то же самое в нормальной технологической цепочке, .... (1)Тривиально - попытки поиметь нечто вроде секционированной таблицы на SE. .... (2)
(2) - признаться, не выглядит ответом на (1). Вы пытаетесь ответить "когда такая задача может возникнуть", а я прошу - нормальную технологическую цепочку, о чем Вы не сказали ни слова.

Hint: "нормальная технологическая цепочка" подразумевает в том числе те или иные гарантии валидности автоматически генерируемых объектов. Скажем, в базе будет висеть DDL-триггер, который отловит Ваш rename и инициирует пересоздание триггера.
...
Рейтинг: 0 / 0
04.04.2008, 09:40
    #35234794
RA\/EN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
softwarer RA\/EN softwarer1. Покажете то же самое в нормальной технологической цепочке, .... (1)Тривиально - попытки поиметь нечто вроде секционированной таблицы на SE. .... (2)
(2) - признаться, не выглядит ответом на (1). Вы пытаетесь ответить "когда такая задача может возникнуть", а я прошу - нормальную технологическую цепочку, о чем Вы не сказали ни слова.

Hint: "нормальная технологическая цепочка" подразумевает в том числе те или иные гарантии валидности автоматически генерируемых объектов. Скажем, в базе будет висеть DDL-триггер, который отловит Ваш rename и инициирует пересоздание триггера.
О критериях "нормальности" можно спорить до хрипоты...
Я считаю, что наворачивать кодогенерацию там, где достаточно получить информацию стандартными средствами Oracle, есть пустая трата времени разработчиков, тестеров и сопровожденцев.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SQL> create or replace trigger trig1 before insert on toredo 
   2   begin dbms_output.put_line(dbms_utility.format_call_stack); end;
   3   /
 
Trigger created
 
SQL> insert into toredo values( 1 );
 
----- PL/SQL Call Stack -----
  object      line  object
  handle    number  name
222120FC          1   K.TRIG1

 
 1  row inserted
 
SQL> 
Вот, собственно, и все. Остальной код дописать не проблема.
...
Рейтинг: 0 / 0
04.04.2008, 10:28
    #35234922
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
RA\/ENО критериях "нормальности" можно спорить до хрипоты...
О полном списке - безусловно. Но вряд ли Вы будете спорить с тем, что надежность входит в них под одним из первых номеров.

RA\/ENЯ считаю, что наворачивать кодогенерацию там, где достаточно получить информацию стандартными средствами Oracle, есть пустая трата времени разработчиков, тестеров и сопровожденцев.

[src oracle]SQL> create or replace trigger trig1 before insert on toredo
2 begin dbms_output.put_line(dbms_utility.format_call_stack); end;
3 /

Trigger created

SQL> insert into toredo values(1);

----- PL/SQL Call Stack -----
object line object
handle number name
==>222120FC 1 K.TRIG1
Cчитать, безусловно, можно что угодно. Вот обосновать, что одна кодогенерация (которая рассует по десяти-ста-десяти тысячам таблиц триггер с парсингом стека) чем-то кардинально отличается от другой кодогенерации (которая рассует тот же триггер с константой) - оно как-то сложнее. Обосновать пустую трату времени разработчиков на константы по сравнению с пустой тратой времени разработчиков на парсинг - тоже не совсем тривиально.
...
Рейтинг: 0 / 0
04.04.2008, 11:01
    #35235045
RA\/EN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
softwarer... Вот обосновать, что одна кодогенерация (которая рассует по десяти-ста-десяти тысячам таблиц триггер с парсингом стека) чем-то кардинально отличается от другой кодогенерации (которая рассует тот же триггер с константой) - оно как-то сложнее...
А где я говорил, что предполагаю кодогенерацию? Я ее не предполагаю. И вообще это форум по Oracle, а не проектированию :)
...
Рейтинг: 0 / 0
04.04.2008, 12:47
    #35235534
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
RA\/ENА где я говорил, что предполагаю кодогенерацию? Я ее не предполагаю.
Тогда Вы ее как-то странно не предполагаете. Вы почему-то в одном случае не предполагаете, а в другом считаете, что она будет.

RA\/ENИ вообще это форум по Oracle, а не проектированию :)
То есть Вы переходите к версии "это может понадобиться при кривом проектировании"?
...
Рейтинг: 0 / 0
04.04.2008, 14:01
    #35235820
RA\/EN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
softwarerТо есть Вы переходите к версии "это может понадобиться при кривом проектировании"?
"Кривово" проектирования не существует. Существует либо необоснованные с точки зрения требований проекта архитектурные решения, либо долбоежизм клинический обыкновенный.
Под вторую категорию не подходит ни использование formаt_call_stack, ни кодогенератор. Что из двух решений попадает в первую - с переменным успехом зависит от проекта.

Ладно, вот второй пример - из "была ли функция вызвана из триггера, и, если да, то на какой он таблице?" Вопрос практически эквивалентен авторскому. Предлагаете сквозную передачу параметров через десяток функций заложить?
...
Рейтинг: 0 / 0
04.04.2008, 19:08
    #35236909
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
softwarer"Таблица, на которой повешен триггер" - идеологическая константа.

Well, I do not know what is идеологическая константа, but I do know tables can be renamed :).

SY.
...
Рейтинг: 0 / 0
04.04.2008, 19:45
    #35236958
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
In 10g:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT  TABLE_OWNER,
        TABLE_NAME
  INTO  v_TABLE_OWNER,
        v_TABLE_NAME
  FROM  ALL_TRIGGERS
  WHERE OWNER = SYS_CONTEXT('USERENV','CURRENT_SCHEMA')
    AND TRIGGER_NAME = $$PLSQL_UNIT;

SY.
...
Рейтинг: 0 / 0
04.04.2008, 20:41
    #35237002
ГостЪ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
SY
Код: plaintext
1.
    AND TRIGGER_NAME = $$PLSQL_UNIT;
SY.

Для простоты функция

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SQL> create or replace function test_pl_unit return varchar2
   2   is 
   3   begin  
   4     return $$PLSQL_UNIT;
   5   end; 
   6   /

Function created.

SQL> select test_pl_unit from dual;

TEST_PL_UNIT
--------------------------------------------------------------------------------
TEST_PL_UNIT

SQL> alter function test_pl_unit compile PLSQL_CCFLAGS='PLSQL_UNIT:123';

Function altered.

SQL> select test_pl_unit from dual;

TEST_PL_UNIT
--------------------------------------------------------------------------------
 123 

Как сменить на строковое значение не догнал:(
...
Рейтинг: 0 / 0
04.04.2008, 22:09
    #35237099
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
ГостЪДля простоты функция


Well, if you are concerned about $$PLSQL_UNIT, use famous who_am_i function:

Код: plaintext
1.
2.
3.
4.
5.
SELECT  TABLE_OWNER,
        TABLE_NAME
  INTO  v_TABLE_OWNER,
        v_TABLE_NAME
  FROM  ALL_TRIGGERS
  WHERE OWNER || '.' || TRIGGER_NAME = who_am_i;

SY.
...
Рейтинг: 0 / 0
05.04.2008, 09:55
    #35237311
триггер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
SY

Спасибо!
...
Рейтинг: 0 / 0
05.04.2008, 14:45
    #35237462
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
RA\/ENЛадно, вот второй пример - из "была ли функция вызвана из триггера, и, если да, то на какой он таблице?" Вопрос практически эквивалентен авторскому. Предлагаете сквозную передачу параметров через десяток функций заложить?
Этот пример в нормальной практике работы существовать не может и не должен. Функции должно быть все равно, откуда ее вызвали; если не все равно, если какие-то ее действия этим определяются, это - ошибка проектирования. В некоторых случаях может понадобиться понятие контекста - "правызывающий" устанавливает некоторое состояние, правызываемый им пользуется.

Я могу назвать единственную ситуацию, когда более-менее интересен ответ на приведенный Вами вопрос. Но я решаю ее несколько проще:

Код: plaintext
1.
2.
3.
4.
begin
  ...
  Log.Write ('Так вот кто портит нам данные! ' || dbms_utility.format_call_stack());
  ...
end;

SYWell, I do not know what is идеологическая константа, but I do know tables can be renamed :)
Безусловно, can. И что из этого следует, если мы говорим о реальном производственном процессе? Переименование таблицы - очень редкая операция относительно других alter-ов, которые также вызывают необходимость менять навешенные триггера. Поэтому придумав способ защищаться только и исключительно от rename, мы практически зря потратим время, увеличив общую надежность кода на очень малую величину. А любой нормальный способ, контролирующий alter-ы вообще, будет работать и для rename тоже - убирая тем самым необходимость во всей этой дополнительной шелухе.

Что же касается идеологической константы.... ну вот скажем число "пи" - как Вы полагаете, константа или нет? Хотя мы оба знаем, что в очередной версии софта оно can be changed - например, может потребоваться повысить ему разрядность.

P.S. Помимо прочего, у меня действует рефлекс на минимизацию обращений к data dictionary - это часто здорово тормозит работу.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
30.01.2020, 18:32
    #39920651
AT2020
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в ДМЛ-триггере название таблицы, на которую повешен триггер
cuurenct_schema не работает при работе с таблицами из других схем

owa_util.who_called_me(owner => lc_owner, name => lc_trigger, lineno => ln_line, caller_t => lc_caller);
dbms_output.put_line('lc_owner => '||lc_owner);
dbms_output.put_line('lc_trigger => '||lc_trigger);
dbms_output.put_line('ln_line => '||ln_line);
dbms_output.put_line('lc_caller => '||lc_caller);
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Определить в ДМЛ-триггере название таблицы, на которую повешен триггер / 25 сообщений из 25, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]