powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Узнать имя таблицы из триггера
90 сообщений из 90, показаны все 4 страниц
Узнать имя таблицы из триггера
    #35420366
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочёл эти две древние темы:

Получение имени "сработавшего" FK при INSERT'е в ХП
http://sql.ru/forum/actualthread.aspx?tid=409862&hl=%ee%ef%f0%e5%e4%e5%eb%e8%f2%fc+%e8%ec%ff+%f2%e0%e1%eb%e8%f6%fb#3928894


Может ли триггер узнать имя или номер таблицы для которой он вызывается?
http://sql.ru/forum/actualthread.aspx?tid=60592&hl=%ee%ef%f0%e5%e4%e5%eb%e8%f2%fc+%e8%ec%ff+%f2%e0%e1%eb%e8%f6%fb#430223

Вопрос в следующем. Может спустя столько лет появилась возможность узнать имя таблицы для которой срабатывает триггер? Может это будет в версии 2.х или 3.х?

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

Было бы вообще здорово, если бы была возможно создать один триггер для всех таблиц, в котором можно было бы определять значения контекстных переменных типа CURRENT_TABLE, CURRENT_TRIGGER, или что-то вроде этого.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35420416
Фотография arni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разве бывают тригерры сразу на несколько таблиц?
По-любому триггер нацеливается лишь на одну.
Другое дело, что логику логирования можно не помещать в триггер,
а лишь вызывать из него например ХП, аргументом которой передавать имя таблицы.
В ХП по этому аргументу можно через обращение к системным таблицам узнать поля,
составить текст select'а, исполнять его через execute statement и далее уже логировать как душе удобно.

При такой схеме, триггеров будет много, но они будут состоять лишь из вызыва хранимки.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35420454
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arniРазве бывают тригерры сразу на несколько таблиц?


вот я и про тоже, я имел ввиду, что хорошо бы, если бы они были
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35420461
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arni
Другое дело, что логику логирования можно не помещать в триггер,
а лишь вызывать из него например ХП, аргументом которой передавать имя таблицы.


Ну да, сейчас так и делаю. Просто таблиц многовато.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35420475
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11 arniРазве бывают тригерры сразу на несколько таблиц?
X> вот я и про тоже, я имел ввиду, что хорошо бы, если бы они былиочередной всплеск гиперактивности мутантов...

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35420486
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arni
Другое дело, что логику логирования можно не помещать в триггер,
а лишь вызывать из него например ХП, аргументом которой передавать имя таблицы.
В ХП по этому аргументу можно через обращение к системным таблицам узнать поля,
составить текст select'а, исполнять его через execute statement и далее уже логировать как душе удобно.

При такой схеме, триггеров будет много, но они будут состоять лишь из вызыва хранимки.
да, но вызываю хранимку, ей нужно передать имя триггера или имя таблицы, что на данный момент прописывается ручками.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE OR ALTER TRIGGER SPR_COMMUNICATIONS_BIUD1 FOR SPR_COMMUNICATIONS
ACTIVE BEFORE INSERT OR UPDATE OR DELETE POSITION  1 
AS
declare variable table_name varchar( 100 );
begin
  if (coalesce(rdb$get_context('USER_SESSION','can_exp_change'),'1')='1' )
  then begin
      table_name = 'КОММУНИКАЦИИ';
-- хорошо бы так:       table_name = CURRENT_TABLE;

-- -------логирование
      if (inserting) then execute procedure sp_journaling(table_name,'ДОБАВЛЕНИЕ', new.id, null, null);
      if (updating) then execute procedure sp_journaling(table_name,'ИЗМЕНЕНИЕ', old.id, null, null);
      if (deleting) then begin
        execute procedure sp_journaling(table_name,'УДАЛЕНИЕ', old.id, null, null);
-- -------логирование

        execute procedure sp_send_to_deleted(old.id, 'SPR_COMMUNICATIONS_');
      end
  end
end
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35420498
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
X11 arniРазве бывают тригерры сразу на несколько таблиц?
X> вот я и про тоже, я имел ввиду, что хорошо бы, если бы они былиочередной всплеск гиперактивности мутантов...

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.4

мерси за комплимент ))))))))
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35420517
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напиши программу, которая будет вытаскивать список таблиц и для выбранных из списка по шаблону генерировать нужный текст триггера.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35420549
Фотография arni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
по-моему всякие "КОММУНИКАЦИИ", "ДОБАВЛЕНИЕ", "ИЗМЕНЕНИЕ" и "УДАЛЕНИЕ" - слишком жирно для и без того сумашедшим образом распухающих таблиц логгов. Все эти рюшки можно и при просмотре добавить.

Приведу кусок из своих закромов:

Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
CREATE OR ALTER trigger SP_COLOR_LOG_I for SP_COLOR
active after insert position  1 
AS
begin
  --логгируем вставку строки
  execute procedure SYS_LOG_METADATA('SP_COLOR', new.ID, '+');
end

CREATE OR ALTER trigger SP_COLOR_LOG_U0 for SP_COLOR
active before update position  1 
AS
begin
  --логгируем изменение строки (фиксация старого состояния)
  execute procedure SYS_LOG_METADATA('SP_COLOR', old.ID, '<');
end

CREATE OR ALTER trigger SP_COLOR_LOG_U1 for SP_COLOR
active after update position  1 
AS
begin
  --логгируем изменение строки (фиксация нового состояния)
  execute procedure SYS_LOG_METADATA('SP_COLOR', new.ID, '>');
end

CREATE OR ALTER trigger SP_COLOR_LOG_D for SP_COLOR
active before delete position  1 
AS
begin
  --логгируем удаление строки
  execute procedure SYS_LOG_METADATA('SP_COLOR', old.ID, '-');
end

CREATE OR ALTER PROCEDURE SYS_LOG_METADATA(
    TBL_NAME VARCHAR( 32 ),
    TBL_ID INTEGER,
    TBL_OPER CHAR( 1 ))
AS
declare variable TEXT       varchar( 9999 ) default '';
declare variable SEPARATOR  varchar( 78 ) default '';
declare variable FLD        varchar( 32 );
declare variable STATM      varchar( 9999 ) default '';
begin
  --находим поля таблицы и формируем список выбора
  for
    select RDB$FIELD_NAME
      from RDB$RELATION_FIELDS
     where RDB$RELATION_NAME=:TBL_NAME
       and RDB$FIELD_NAME<>'ID'
     order by RDB$FIELD_POSITION
      into :FLD
  do begin
    FLD = trim(FLD);
    STATM = STATM || SEPARATOR || '''' || FLD || ' = ''' ||
      '||cast(coalesce(' || FLD || ','''') as varchar(200))';
    if (SEPARATOR='') then
      SEPARATOR = '||ascii_char(13)||ascii_char(10)||';
  end

  --формируем запрос
  STATM = 'select ' || STATM || ' from ' || TBL_NAME ||
    ' where ID=' || cast(TBL_ID as varchar( 9 ));

  --исполняем его
  execute statement STATM into :TEXT;

  --вставляем снимок строки в лог
  insert into SYS_LOG
    (MODULE, TBL_NAME, TBL_ID, TBL_OPER, TEXT)
  values
    ('(auto)', :TBL_NAME, :TBL_ID, :TBL_OPER, :TEXT);
end
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35420567
Фотография Attid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛентяйНапиши программу, которая будет вытаскивать список таблиц и для выбранных из списка по шаблону генерировать нужный текст триггера.
можно даже SP =)
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35420643
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arni, спасибо. Переделаю, как у тебя. А то у меня немного не так.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35420731
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arni, я смотрю, что ты не хранишь в логах имя пользователя, какой смысл логов?
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35420741
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arni
Код: plaintext
SEPARATOR = '||ascii_char(13)||ascii_char(10)||';

Вот это вот - зачем? Не понял.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35420784
Фотография arni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11arni, я смотрю, что ты не хранишь в логах имя пользователя, какой смысл логов?
есть такое поле с default user или в тригере через current_user цепляется - сейчас не помню, но вобщем автоматом садится
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35420817
Фотография arni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery arni
Код: plaintext
SEPARATOR = '||ascii_char(13)||ascii_char(10)||';

Вот это вот - зачем? Не понял.
Лог - это одно поле, куда в текстовом виде складываются все поля. Перевод строки нужен, чтобы при просмотре было удобочитабеельнее. Например:
Код: 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.
27.
IZD_VID_ID = 3952
NUM = 3
ITEM_CAPTION = Крыша
EXACT_MAT_ID = 
EXACT_MAT_WIDTH = 
EXACT_COLOR_ID = 
F_MAT_BY_REF = =[МАТк]
F_MAT_WIDTH_BY_REF = =[ТЛЩк]
F_COLOR_BY_REF = =[ЦВЕТк]
SIZE1_KOD = 
SIZE1_CAPTION = 
F_SIZE1 = =[ШКш] + 4
SIZE2_KOD = 
SIZE2_CAPTION = 
F_SIZE2 = =[ШКг] + 100
KOL_KOD = 
F_KOL = [КОЛ]
F_PROF_BY_REF = 
F_TEMP_BEFORE = [Элит?]
F_PRIM = 
F_SIZE1_CUT = 
F_SIZE2_CUT = 
F_KOL_CUT = 
EXACT_DRAFT = 222000000001010
F_PRIM_CUT = 
ITEM_KIND_ID = 0
CAPTION_FACTOR_ID = 2
IF_SKIP_IN_CHILD = 0
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35420848
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лог глазами прямо из таблицы читаешь?
Я вот для этого отдельные процедуры/формы сделал. Зря старался?
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35420909
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arni по-моему всякие "КОММУНИКАЦИИ", "ДОБАВЛЕНИЕ", "ИЗМЕНЕНИЕ" и "УДАЛЕНИЕ" - слишком жирно для и без того сумашедшим образом распухающих таблиц логгов. Все эти рюшки можно и при просмотре добавить.
ага, особенно с полем, размер которого 10К.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35420960
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arni
CREATE OR ALTER trigger SP_COLOR_LOG_U0 for SP_COLOR
active before update position 1
AS
begin
--логгируем изменение строки (фиксация старого состояния)
execute procedure SYS_LOG_METADATA('SP_COLOR', old.ID, '<');
end

CREATE OR ALTER trigger SP_COLOR_LOG_U1 for SP_COLOR
active after update position 1
AS
begin
--логгируем изменение строки (фиксация нового состояния)
execute procedure SYS_LOG_METADATA('SP_COLOR', new.ID, '>');


Не понятно, что даёт фиксация старого и нового состояния, тем более что значение ID, как правило не меняется.
т.е. в таблице будет две записи:
> ID = 12
< ID = 12
что из этого можно понять?

или в лог записываются старые и новые значения, так ля понял?
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35421052
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Не понятно, что даёт фиксация старого и нового состояния, тем более
что значение ID, как правило не меняется.
т.е. в таблице будет две записи:
> ID = 12
< ID = 12
что из этого можно понять?
или в лог записываются старые и новые значения, так ля понял?
Нет. Там у него идет вызов ХР, которая в свою очередь селектит нужные поля
по указанному ID и записывает их в таблицу-лог (ну и таймштамп, думаю, добавляет).

"Ошибка" у arni в другом - нет смысла использовать два триггера, когда можно
обойтись одним (и фактически даже одним вызовом ХР). Единственное "но" -
это если у него сложная логика и цепочка триггеров - тогда ставить before-триггер
первым в цепочке, after-триггер - последним в цепочке.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35421081
Фотография arni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Не понятно, что даёт фиксация старого и нового состояния, тем более что значение ID, как правило не меняется.
т.е. в таблице будет две записи:
> ID = 12
< ID = 12
что из этого можно понять?

или в лог записываются старые и новые значения, так ля понял?
Разве плохо наблюдать в двух соседних строках состояние строки ДО и ПОСЛЕ правки?
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35421095
Фотография arni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
"Ошибка" у arni в другом - нет смысла использовать два триггера, когда можно
обойтись одним (и фактически даже одним вызовом ХР). Единственное "но" -
это если у него сложная логика и цепочка триггеров - тогда ставить before-триггер
первым в цепочке, after-триггер - последним в цепочке.
Если бы логирование происходило в триггере, то действительно подтавляя сначала old.* значения, а потом new.* значения можно сохранить состояние и до и после. Перенося же логику в XП мы теряем все зацепки new.* и old.*. Остается только сканировать текущее значение. Поэтому вызов идет из двух триггеров.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35421109
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arniЕсли бы логирование происходило в триггере, то действительно подтавляя сначала old.* значения, а потом new.* значения
можно сохранить состояние и до и после. Перенося же логику в XП мы теряем все зацепки new.* и old.*. Остается только сканировать
текущее значение. Поэтому вызов идет из двух триггеров.
Отмазка не принята. Ничто (ну, кроме вышеназванных проблем с цепочками триггеров) не
мешает в одном триггере вызывать ХР два раза (один раз с OLD, другой раз с New).

В принципе, можно даже в ХР добавить еще один параметр, чтобы передавать old и new
одновременно, но это уже спорно - лучше / хуже.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35421139
Фотография arni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамОтмазка не принята. Ничто (ну, кроме вышеназванных проблем с цепочками триггеров) не
мешает в одном триггере вызывать ХР два раза (один раз с OLD, другой раз с New).

В принципе, можно даже в ХР добавить еще один параметр, чтобы передавать old и new
одновременно, но это уже спорно - лучше / хуже
Рустам, подумай: в хранимку я не передаю никаких реальных данных, только ID изменяемой строки.
Сама хранимка уже выбирает данные из рабочих таблиц по этому ID. Она ничего не знает про new.* и old.*. Она может только прочитать ТЕКУЩЕЕ значение. Текущим значением в фазе BEFORE за пределами самого триггера будет еще не измененная строка. Текущим значением в фазе AFTER за пределами самого триггера будет уже измененная строка. Т.о. перенося логиrу логирования за пределы триггера (в ХП) мы вынуждены дергать её дважды в двух тригерах на два состояния.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35421144
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно

на строку
Код: plaintext
execute statement STATM into :TEXT;
can't format message 13:96 -- message system code -4.
Invalid argument in EXECUTE STATEMENT - cannot convert to string.
At procedure 'SP_SYS_LOG' line: 34, col: 3.


влияет ли то, что база в кодировке UTF8?
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35421163
Фотография arni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Странно

на строку
Код: plaintext
execute statement STATM into :TEXT;
can't format message 13:96 -- message system code -4.
Invalid argument in EXECUTE STATEMENT - cannot convert to string.
At procedure 'SP_SYS_LOG' line: 34, col: 3.

глянь, что осаждается в переменной STATM.
Может там переполнение, либо с парностью кавычек напутал или еще чего...
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35421176
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arni> Рустам, подумай: в хранимку я не передаю никаких реальных данных, только ID изменяемой строки.
arni> Сама хранимка уже выбирает данные из рабочих таблиц по этому ID. Она ничего не знает про new.* и old.*.

Ну, так я и сказал выше.

arni> Она может только прочитать ТЕКУЩЕЕ значение.

А вот тут попутал :) Как-то не подумал об этом.
Тогда да, в текущем раскладе все верно.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35421307
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
--формируем запрос
  STATM = 'select ' || STATM || ' from ' || TBL_NAME ||
    ' where ID=' || cast(TBL_ID as varchar( 9 ));

  stam2 = :statm;
  SUSPEND;

stam2 почему то NULL
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35421318
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дошло, я передавал имя таблицы маленькими буквами.

теперь
Код: plaintext
where UPPER(RDB$RELATION_NAME)= UPPER(:TBL_NAME)
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35421442
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Вопрос в следующем. Может спустя столько лет появилась возможность узнать имя таблицы для которой срабатывает триггер? Может это будет в версии 2.х или 3.х?

В 2.5 будет можно. Примерно так:
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
CREATE PROCEDURE GET_CALLER_NAME 
returns (
    object_name char( 31 ),
    object_type smallint)
as
declare variable tran_id integer;
begin
  TRAN_ID = CURRENT_TRANSACTION;

  IN AUTONOMOUS TRANSACTION DO
  BEGIN
  select first  1  skip  1  CS.mon$object_name, CS.mon$object_type
     from mon$call_stack CS, mon$statements ST where
       CS.mon$statement_id = ST.mon$statement_id
       AND ST.mon$transaction_id = :TRAN_ID
       order by CS.mon$call_id ascending
       into  :OBJECT_NAME, :OBJECT_TYPE;
  END

  SUSPEND;

end

-------------
CREATE PROCEDURE TEST_PROC 
returns (
    proc_name char( 31 ))
as
begin
  select OBJECT_NAME from GET_CALLER_NAME
    into :PROC_NAME;
  SUSPEND;
end

--=============
select * from test_proc


Правда на данной стадии разработки на данном запросе Firebird-2.5.0.20542-0_Win32 валится
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35421495
Николай1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
arniЕсли бы логирование происходило в триггере, то действительно подтавляя сначала old.* значения, а потом new.* значения
можно сохранить состояние и до и после. Перенося же логику в XП мы теряем все зацепки new.* и old.*. Остается только сканировать
текущее значение. Поэтому вызов идет из двух триггеров.
Отмазка не принята. Ничто (ну, кроме вышеназванных проблем с цепочками триггеров) не
мешает в одном триггере вызывать ХР два раза (один раз с OLD, другой раз с New).

В принципе, можно даже в ХР добавить еще один параметр, чтобы передавать old и new
одновременно, но это уже спорно - лучше / хуже.


Posted via ActualForum NNTP Server 1.4

А какой-нибудь "buffer-compare old new to different-field-list" в триггре нельзя вызвать?
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35421555
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgmПравда на данной стадии разработки на данном запросе Firebird-2.5.0.20542-0_Win32 валитсяВ трекер внесёшь ?
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35421725
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad afgmПравда на данной стадии разработки на данном запросе Firebird-2.5.0.20542-0_Win32 валитсяВ трекер внесёшь ?
В англицком не силён :(
С другой стороны когда то начинать надо...
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35423928
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николай1> А какой-нибудь "buffer-compare old new to different-field-list" в триггре нельзя вызвать?

Ответил был, если бы понял о чем ты. Но в ситуации arni
(когда логирует отдельная процедура) - нельзя.

2 afgm - из-за автономной транзакции чтоль?


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35423969
mkr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to arni: вставлю 5 копеек можно и так! :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE OR ALTER trigger SP_COLOR_LOG_U0 for SP_COLOR
ACTIVE BEFORE UPDATE OR DELETE POSITION  1 
AS
begin
  IF (UPDATING) THEN
    execute procedure SYS_LOG_METADATA('SP_COLOR', old.ID, '<');
  ELSE
  IF (DELETING) THEN
    execute procedure SYS_LOG_METADATA('SP_COLOR', old.ID, '-');
end

CREATE OR ALTER trigger SP_COLOR_LOG_U1 for SP_COLOR
ACTIVE AFTER INSERT OR UPDATE POSITION  1 
AS
begin
  IF (INSERTING) THEN
    execute procedure SYS_LOG_METADATA('SP_COLOR', new.ID, '+');
  ELSE
  IF (UPDATING) THEN
    execute procedure SYS_LOG_METADATA('SP_COLOR', new.ID, '>');
end
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35423984
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mkrto arni: вставлю 5 копеек
Оставляю от 5 копеек 2
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE OR ALTER trigger SP_COLOR_LOG_U0 for SP_COLOR
ACTIVE BEFORE UPDATE OR DELETE POSITION  1 
AS
  declare variable _action char( 1 );
begin
  IF (UPDATING) THEN _action = '<'; ELSE _action = '-';
  execute procedure SYS_LOG_METADATA('SP_COLOR', old.ID, :_action);
end
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424009
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5 копеек, 2 копейки... Как будто что-то улучшилось... :)


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424037
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меньше буков
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424042
Николай1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
Николай1> А какой-нибудь "buffer-compare old new to different-field-list" в триггре нельзя вызвать?

Ответил был, если бы понял о чем ты. Но в ситуации arni
(когда логирует отдельная процедура) - нельзя.

2 afgm - из-за автономной транзакции чтоль?


Posted via ActualForum NNTP Server 1.4

У меня есть "buffer-compare" - это оператор языка, который (оператор), после сравнения двух буферов, выдает список полей которые отличаются.
Остается извлечь значения этих полей их каждого буфера и сложить куда надо.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424170
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николай1> У меня есть "buffer-compare" - это оператор языка

"У меня" - это в где? И оператор какого языка?

Николай1> Остается извлечь значения этих полей их каждого буфера и сложить куда надо.

Зачем? Сравнивать, извлекать... они итак уже "извлечены" в new и old. ;)


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424219
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
2 afgm - из-за автономной транзакции чтоль?
Скорее всего, потому как без неё работает. Причём валится именно в момент коммита.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424222
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgm> Скорее всего, потому как без неё работает.

Эт хорошо. :) А нафиг она там сдалась, кстати?


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424248
Фотография Пьяный Винни-Пух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
- Больной перед смертью потел?
- Потел, батюшка.
- Это хорошо...
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424254
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, что сдох от не заразной болезни, ПВП. :)


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424268
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
afgm> Скорее всего, потому как без неё работает.
Эт хорошо. :) А нафиг она там сдалась, кстати?

doc\README.monitoring_tables.txt
При первом обращении данные в мониторинговых таблицах "замораживаются".
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424318
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, ты про снапшотность. Да, если процедура будет вызываться несколько раз. Логично.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424335
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ДЕ

Кстати, интересно, почему они снапшотны, а не RC-шны.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424394
Фотография arni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery mkrto arni: вставлю 5 копеек
Оставляю от 5 копеек 2
Недождетесь!
Наглядность и интуитивность кода на уровне "взглянул - понял" - тоже чего-то стоит, пусть и в ущерб кол-ву строк.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424410
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
2 ДЕ

Кстати, интересно, почему они снапшотны, а не RC-шны.

Дима уже как-то отвечал на этот вопрос: "Чтобы данные в связанных мониторинговых таблицах были валидны между собой" (не дословно). Иначе обращение к ним в разное время даст неверные результаты по связям.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424420
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, последнее время я все больше склоняюсь к тому, чтобы имитировать уровень изоляции рабочей транзакции. Т.е. для read-committed делать "снапшотность" мониторинга на уровне клиентского запроса, а не транзакции.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424429
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrкстати, последнее время я все больше склоняюсь к тому, чтобы имитировать уровень изоляции рабочей транзакции. Т.е. для read-committed делать "снапшотность" мониторинга на уровне клиентского запроса, а не транзакции.
В целом логично. Хотя для приведённых выше изворотов кроме как автономкой не получится. Более того: захотел тут получать снимок таблицы использования памяти без старта новой транзакции, так пришлось вообще через новый EXECUTE STATEMENT делать, т.к. SUSPEND из автономного блока не работает.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424551
Anjey aka PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrкстати, последнее время я все больше склоняюсь к тому, чтобы имитировать уровень изоляции рабочей транзакции. Т.е. для read-committed делать "снапшотность" мониторинга на уровне клиентского запроса, а не транзакции.

мб стоит добавить дополнительный параметр для RC транзакции, чтобы контролировать это поведение?
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424564
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrТ.е. для read-committed делать "снапшотность" мониторинга на уровне клиентского запроса, а не транзакции.
и что тебя подталкивает сделать этот сомнительный шаг? :-)
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424681
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvи что тебя подталкивает сделать этот сомнительный шаг? :-)
как минимум мониторить можно будет одной "вечной" RC read-only транзакцией, не терзая понапрасну счетчик. Да и в целом, более логично будет поведение выглядеть. А если по уму сделать, то еще и в процедурах станет возможным использование "живых" данных мониторинга, а не "замороженных".

альтернатива - оставить все как есть и реализовать явный "сброс" мониторинга (через SQL) для текущей транзакции. Правда, меня пугают возможные извраты типа:
Код: plaintext
1.
FOR SELECT ... FROM MON$...
DO DROP MONITORING SNAPSHOT;
:-)
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424811
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv dimitrТ.е. для read-committed делать "снапшотность" мониторинга на уровне клиентского запроса, а не транзакции.
и что тебя подталкивает сделать этот сомнительный шаг? :-)Сомнительно сделали как раз в ИБ, мы пока что только скопировали эту особенность. Но она нам не нравится.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424914
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНо она нам не нравится.
вообще мне тоже не нравится что для получения обновленной информации надо рестартовать транзакцию. Но с другой стороны имеющиеся тулзы, да и вообще, ориентированы на получение связанной информации - БД-коннекты-транзакции-запросы.
То есть, логически было бы хорошо стартовать RC read only, и перечитыванием запроса получать обновления, но тогда не будет консистентности таблиц. А раз надо - придется стартовать снапшот-транзакцию, и все равно рестартовать ее когда надо обновить инфу. Тогда, по большому счету, вычитка данных таблиц мониторинга в RC read only теряет смысл.
Так что я за совместимость.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424917
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arniНаглядность и интуитивность кода на уровне "взглянул - понял" - тоже чего-то стоит, пусть и в ущерб кол-ву строк.
Наглядность и интуитивность - вещи весьма субъективные.
А длина - она и в Африке длина
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424929
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы пока за
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424931
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
моб ять.

так вот. я бы пока за isc_refresh_mon_info проголосовал. Т.е. за вызов api. а дальше можно поглядеть.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35424947
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr
Код: plaintext
1.
FOR SELECT ... FROM MON$...
DO DROP MONITORING SNAPSHOT;

Если всё будет в автомате, то получить стабильный снимок мониторинга можно будет только "правильной" транзакцией.
Если дать возможность управлять, то это может быть лучше в плане контроля разработчиком.
например:
процедура_1 прочитала некоторые мониторинговые данные и вызвала процедуру_2
процедура_2 сделала DROP MONITORING SNAPSHOT и вернула управление процедуре_1
процедура_1 запросила другие таблицы мониторинга и "налетела" на несогласованность.

Если кого такой вариант не устроит могут использовать автономки. Минус действительно видится один - счётчик дёргается с вытекающими.

2kdv
Добавление вызова API мне нравится. Но процедуркам оно разобраться между собой не поможет.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35425053
Николай1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
Николай1> У меня есть "buffer-compare" - это оператор языка

"У меня" - это в где? И оператор какого языка?

Николай1> Остается извлечь значения этих полей их каждого буфера и сложить куда надо.

Зачем? Сравнивать, извлекать... они итак уже "извлечены" в new и old. ;)


Posted via ActualForum NNTP Server 1.4

4GL

В смысле "извлечены" ?
Буферы содержат все поля, а сохранить в аудите надо только те, которые изменились. buffer-compare и дает их список.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35425182
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМинус действительно видится один - счётчик дёргается с вытекающими.
у нас в IBTM (Transaction Monitor) идет считывание состояния транзакций (OIT, OST, OAT, Next) каждую минуту.
Если делать через services api - старта транзакций нет, но нет и инфы о реальном числе активных транзакций.
Firebird API - увеличивает счетчик Next +1
Firebird mon$ и IB tmp$ - требуется старт транзакции, т.е. тоже Next +1

Так вот. Даже если с БД ничего не делают, Next+1 за сутки (!) растет всего на 1440 отсчетов (минут в сутках). На мой взгляд это полная фигня по сравнению с любой минимально активной системой, в которой нынче количество транзакций за рабочие сутки начинается минимум от 15000.
В среднем - 200к транзакций в сутки. У "гигантов" - 500к и более.

Так что рестарт транзакции для снятия инфы каждую минуту - фигня.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35425221
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и еще - отсчет для tmp$ (пока mon$ не поддерживается) делается так:
коннект
старт транзакции
получение данных из tmp$
коммит
дисконнект

для этой задачи держать открытым коннект, да еще транзакцию активной, пусть даже и rc read only - считаю моветоном.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35425334
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvи еще - отсчет для tmp$ (пока mon$ не поддерживается) делается так:
коннект
старт транзакции
получение данных из tmp$
коммит
дисконнект

для этой задачи держать открытым коннект, да еще транзакцию активной, пусть даже и rc read only - считаю моветоном.Для этой задачи - может быть.
Но не в общем случае.
Когда сервер загружен так, что мыша не проползает, и нужно быстро прибить виновника, ты не сможешь даже получить коннект в приемлемое время.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35425437
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvТак что рестарт транзакции для снятия инфы каждую минуту - фигня.
Согласен. Для снятия статистики - фигня. Но для предложенного варианта получения имени текущего объекта, совсем не фигня. Если хотя бы половина объектов, задействованных в пользовательском запросе, будут порождать автономки, то это минимум рост счётчика в разы, а реально и в десятки раз.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35426281
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrкстати, последнее время я все больше склоняюсь к тому, чтобы имитировать уровень изоляции рабочей транзакции. Т.е. для read-committed делать "снапшотность" мониторинга на уровне клиентского запроса, а не транзакции.+1

Я бы даже предложил забить на эту согласованность данных (это же не реальные данные, а данные мониторинга), хотя это кому-то покажется крамолой. Нехай будет RC-read (хотя это больше похоже на dirty read ;-) ). А различные "DROP MONITORING" считаю ненужным извращением.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35426285
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николай1В смысле "извлечены" ?Находятся в этой структуре.

Николай1Буферы содержат все поля, а сохранить в аудите надо только те, которые изменились. buffer-compare и дает их список.Решать, что сохранять, а что нет должен не компарер, а автор механизма логирования. Это, во-первых.
Во-вторых, все эти сравнения и "выборка только измененных" по времени, очень вероятн,
что уступят простому копированию (правда выиграет по занимаемому месту).
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35864312
dedRasta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
afgmX11
Вопрос в следующем. Может спустя столько лет появилась возможность узнать имя таблицы для которой срабатывает триггер? Может это будет в версии 2.х или 3.х?

В 2.5 будет можно. Примерно так:
...
Правда на данной стадии разработки на данном запросе Firebird-2.5.0.20542-0_Win32 валится

Сейчас попробовал (версия 2.5.0.22796) - все работает!
Так что если добавить преддложенную товарищем KiLLun строчку
Код: plaintext
1.
Select rdb$relation_name from rdb$triggers where rdb$trigger_name =: procname into :tablename
то обсуждение заканчивается вполне позитивно.

C уважением

Александр
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35893865
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dedRasta[quot afgm][quot X11]
Сейчас попробовал (версия 2.5.0.22796) - все работает!


Не могу найти 2.5.0. 22796 или выше для Windows. Не подскажите ли? Уже минут сорок в гугле и в гугл-группах ищу.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35893889
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Не могу найти 2.5.0. 22796 или выше для Windows. Не подскажите ли? Уже минут сорок в гугле и в гугл-группах ищу.
http://firebirdsql.org/download/snapshot_builds/win/
http://193.110.114.157/firebird/
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35893906
Фотография zirra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11 , а на официальном сайте смотреть не пробовал?..
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35894034
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ура, нашёл
http://firebirdsql.org/downloads/snapshot_builds/win/
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35894042
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zirra,

Искал конечно же. Но там только альфа 1, не знаю, где твоя ссылка живёт на офиц. сайте.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35894054
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И на офиц. сайте тоже нашёл, спасибо.

Windows 32-bit / 64-bit v.2.1.x and v.2.5 (HEAD)

Просто меня смутило слово HEAD в названии ссылки.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35894070
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код нерабочий, ругается на procname

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
AS
declare variable table_name varchar( 50 );
declare variable tablename varchar( 50 );
begin
  if (coalesce(rdb$get_context('USER_SESSION','can_exp_change'),'1')='1' )
  then begin
      table_name = 'OBJECTS';



      Select rdb$relation_name from rdb$triggers where rdb$trigger_name =: procname into :tablename;


      if (inserting) then execute procedure SP_SYS_LOG(table_name, new.id, '+');
      if (updating) then execute procedure SP_SYS_LOG(table_name, old.id, '<');
      if (deleting) then begin
        execute procedure SP_SYS_LOG(table_name, old.id, '-');
        execute procedure sp_send_to_deleted(old.id, table_name);
      end
  end
end
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35894074
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
can't format message 13:794 -- message system code -4.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
PROCNAME.
At line 10, column 76.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35894081
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может мне нужно сделать бэкап/рестор?

База создавалась под FB 2.1, потом сделал бэкап и восстановил под FB 2.5 alfa1.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35894091
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Код нерабочий, ругается на procname
Код: plaintext
1.
...rdb$trigger_name =: procname...
...rdb$trigger_name = :procname...
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35894104
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что это за procname, где её брать?
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35894295
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11а что это за procname, где её брать?
Смотри 4-й топик в этом топике
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35894345
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А 4ый это как Вы имеете ввиду? У меня 4ый - это мой - вот он:

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


Ну да, сейчас так и делаю. Просто таблиц многовато.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35894504
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11А 4ый это как Вы имеете ввиду? У меня 4ый - это мой - вот он:
Имел ввиду 4-й пост в топике, и забыл что на 2-й странице
Имелся ввиду пример:
/topic/574720&pg=2#5911453
Код: plaintext
-------------\nCREATE PROCEDURE TEST_PROC \nreturns (\n    proc_name char( 31 ))\nas\nbegin\n  select OBJECT_NAME from GET_CALLER_NAME\n    into :PROC_NAME;\n  SUSPEND;\nend\n
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35894627
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По теме топика. Именно табличку и именно из триггера (FB2.5):
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
  
SET TERM ^ ; 

CREATE PROCEDURE GET_TABLE_NAME_FOR_TRIGGER
RETURNS (
    TABLE_NAME CHAR( 31 ) CHARACTER SET UNICODE_FSS COLLATE UNICODE_FSS)
AS
BEGIN
  SUSPEND;
END^

SET TERM ; ^

CREATE TABLE PROTOCOL_TABLE_NAME (
    ID          INTEGER,
    TABLE_NAME  CHAR( 31 ) CHARACTER SET UNICODE_FSS
);

SET TERM ^ ;

CREATE TRIGGER PROTOCOL_TABLE_NAME_BI0 FOR PROTOCOL_TABLE_NAME
ACTIVE BEFORE INSERT POSITION  0 
AS
BEGIN
 SELECT TABLE_NAME FROM GET_TABLE_NAME_FOR_TRIGGER INTO NEW.TABLE_NAME;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE GET_TABLE_NAME_FOR_TRIGGER
RETURNS (
    TABLE_NAME CHAR( 31 ) CHARACTER SET UNICODE_FSS COLLATE UNICODE_FSS)
AS
DECLARE VARIABLE OBJECT_NAME CHAR( 31 ) CHARACTER SET UNICODE_FSS;
DECLARE VARIABLE  OBJECT_TYPE SMALLINT;
DECLARE VARIABLE TRAN_ID INTEGER;    
BEGIN
  TRAN_ID = CURRENT_TRANSACTION;

  IN AUTONOMOUS TRANSACTION DO
  BEGIN
    SELECT FIRST  1  SKIP  1  CS.MON$OBJECT_NAME, CS.MON$OBJECT_TYPE
     FROM MON$CALL_STACK CS, MON$STATEMENTS ST WHERE
       CS.MON$STATEMENT_ID = ST.MON$STATEMENT_ID
       AND ST.MON$TRANSACTION_ID = :TRAN_ID
       ORDER BY CS.MON$CALL_ID ASCENDING
       INTO  :OBJECT_NAME, :OBJECT_TYPE;
  END

  IF (EXISTS (SELECT RDB$TYPE FROM RDB$TYPES
    WHERE RDB$FIELD_NAME='RDB$OBJECT_TYPE'
    AND RDB$TYPE_NAME='TRIGGER'
    AND RDB$TYPE=:OBJECT_TYPE)) THEN
  BEGIN
    SELECT RDB$RELATION_NAME FROM RDB$TRIGGERS WHERE RDB$TRIGGER_NAME= :OBJECT_NAME INTO :TABLE_NAME;
    SUSPEND;
  END
  ELSE
  BEGIN
    TABLE_NAME = NULL;
    SUSPEND ;
  END
end^

SET TERM ; ^

INSERT INTO PROTOCOL_TABLE_NAME(ID) VALUES( 1 );
INSERT INTO PROTOCOL_TABLE_NAME(ID) VALUES( 2 );
INSERT INTO PROTOCOL_TABLE_NAME(ID) VALUES( 3 );

COMMIT WORK;

Далее смотрим содержимое PROTOCOL_TABLE_NAME
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #35894762
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Узнать имя таблицы из триггера
    #39573766
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgmПо теме топика. Именно табличку и именно из триггера (FB2.5):
Код: sql
1.
2.
3.
4.
5.
  
SET TERM ^ ; 

CREATE PROCEDURE GET_TABLE_NAME_FOR_TRIGGER
RETURNS (



Это работает только в тригге BEFOR?
Потому, как в триггере AFTER UPDATING имя таблицы не вылавливается
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #39573842
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

имя таблицы в триггере вообще никак не вылавливается, совсем. потому что триггер создается для конкретной таблицы.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #39573849
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это я понял.
Вылавливается в процедуре GET_TABLE_NAME_FOR_TRIGGER 6980844

Не могу понять, почему имя таблицы может не вылавливаться, в каких случаях.
Оно то вылавливается, то вдруг не вылавливается.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #39573863
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
21.12.2017 16:54, X11 пишет:
> Оно то вылавливается, то вдруг не вылавливается.

оно так потому, что через жопу.
решение - говно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #39573871
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Не могу понять, почему имя таблицы может не вылавливаться, в каких случаях.
Оно то вылавливается, то вдруг не вылавливается.
боже ж ты мой...

1. имя таблице в триггере узнать невозможно, никак и никогда, потому что еще раз повторяю - триггер создается для конкретной таблицы, поэтому идея узнавать имя таблицы, для которой создан триггер, это ахинея какая-то. Таблица УЖЕ известна при создании триггера. Если триггеры создаются каким-то конструктором, то этот конструктор УЖЕ знает имя триггера, и может его воткнуть в текст триггера как константу.

2. в процедуре данные берутся из таблиц mon$. что весьма чревато при определенной нагрузке на сервер, вообще. т.е. это решение может и будет работать, но при 100 и больше пользователях оно будет безбожно тормозить, причем в геометрической прогрессии.

3. данные берутся из mon$call_stack, видимо в after update там уже не те данные.

Не вижу никакого смысла в этом "решении" afgm, совсем.
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #39573873
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Непонятно, почему при INSERTING определятся имя таблицы, а при UPDATING - нет.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
AS
DECLARE VARIABLE STABLE STRING32;
BEGIN
  SELECT TABLE_NAME FROM GET_TABLE_NAME_FOR_TRIGGER INTO STABLE;

      IF (INSERTING) THEN
      BEGIN
        INSERT INTO JOURNAL(TABLE_NAME, IACTION, ID_OBJ) VALUES(:STABLE, 1, NEW.ID);
      END

      IF (UPDATING) THEN
      BEGIN
        INSERT INTO JOURNAL(TABLE_NAME, IACTION, ID_OBJ) VALUES(:STABLE, 2, OLD.ID);
      END

END
...
Рейтинг: 0 / 0
Узнать имя таблицы из триггера
    #39573874
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvНе вижу никакого смысла в этом "решении"

ок
...
Рейтинг: 0 / 0
90 сообщений из 90, показаны все 4 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Узнать имя таблицы из триггера
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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