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


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