powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Узнать имя таблицы из триггера
25 сообщений из 90, страница 2 из 4
Узнать имя таблицы из триггера
    #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
25 сообщений из 90, страница 2 из 4
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Узнать имя таблицы из триггера
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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