powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Динамическое сравнение полей таблицы в тригере
16 сообщений из 16, страница 1 из 1
Динамическое сравнение полей таблицы в тригере
    #40073566
Taraskrez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем Привет. Задумал я написать крутой лог изменений полей в таблицах, хочу чтобы в лог файл записывались только те поля, которые изменились. Много всего прочитал, но немогу понять, как можно динамически сравнивать поля таблицы переменних NEW. и OLD. в тригере.

пробивал через execute statment , так там только select, а мне надо if .. then ... else.
Привожу кусок неработаещего тригера.


CREATE OR ALTER TRIGGER RS_WORK_AI0 FOR RS_WORK
ACTIVE AFTER INSERT POSITION 1
AS
declare variable Sql_txt varchar(500);
declare variable Old_field_name varchar(31);
declare variable new_field_name varchar(31);
declare variable Current_Field_Name varchar(31);
declare variable Changed boolean;
begin
/* Trigger text */


for select rdb$field_name from rdb$relation_fields
where rdb$relation_name = 'RS_WORK' into :Current_Field_Name do
begin

if (new.$field_name <>old.$field_name) then
(Пробывал подставлять в execute statment - IF неработает)

end
end;


Также нашёл вот такой пример , но там тоже IF THEN и тоже незнаю как дальше поступать.
Заранее благодарен за помощь.

[i] for select ' if (new.' || rdb$field_name || ' is null and old.' ||
rdb$field_name || ' is not null or new.' || rdb$field_name ||
' is not null and old.' || rdb$field_name || ' is null or new.' ||
rdb$field_name || ' <> old.' || rdb$field_name || ') then '
from rdb$relation_fields
where rdb$relation_name = 'RS_WORK' into :if_txt
do
begin
execute statment :if_txt'; /* Где-то так, но неработает
end



end
...
Рейтинг: 0 / 0
Динамическое сравнение полей таблицы в тригере
    #40073567
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо, тут программист нужен. ©
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Динамическое сравнение полей таблицы в тригере
    #40073569
Taraskrez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так вроде тут форум программистов ))))
...
Рейтинг: 0 / 0
Динамическое сравнение полей таблицы в тригере
    #40073571
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Taraskrezнемогу понять, как можно динамически сравнивать поля таблицы

Никак, обломись.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Динамическое сравнение полей таблицы в тригере
    #40073572
Taraskrez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А может можно переменные NEW и OLD значение select-ом вибрать, типа так
select myOld, myNew from New,Old .....
...
Рейтинг: 0 / 0
Динамическое сравнение полей таблицы в тригере
    #40073577
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
27.05.2021 15:35, Taraskrez пишет:
> А может можно переменные NEW и OLD значение select-ом вибрать, типа так
> select myOld, myNew from New,Old .....

нет.
тебе поможет MS SQL.
там это есть.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Динамическое сравнение полей таблицы в тригере
    #40073584
Sergey A. Volkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Taraskrez,
Не получиться сделать т.к. текст PSQL переводится в BRL. Имена должны быть известны. Как-то так...

Можно написать хранимую процедуру создающие/изменяющие триггеры с нужной Вам логикой и вызвать эту процедуру при изменения метаданных таблицы.
...
Рейтинг: 0 / 0
Динамическое сравнение полей таблицы в тригере
    #40073585
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При желании можно сделать все что угодно. Завернуть execute bkock в execute statement например.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create procedure TEST_TEST_0001
returns (id integer)
as
declare variable sql varchar(1024);
begin
  sql='execute block returns (id integer) as begin select 1 as id from rdb$database into :id; if (id=1) then id=100; suspend; end';
  for execute statement :sql into :id
  do suspend;
end



Другой вопрос - что у ТС топик посвящен глотанию шаров и натягиванию совы на глобус.
...
Рейтинг: 0 / 0
Динамическое сравнение полей таблицы в тригере
    #40073598
Sergey A. Volkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMaster,
Не надо цель и средства путать. Цель конкретная и достижимая, а вот путь которым пошел ТС ошибочный, поэтому он этот пост и написал.
Зачем за это его гнобить?
...
Рейтинг: 0 / 0
Динамическое сравнение полей таблицы в тригере
    #40073604
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Taraskrez,

а на какое событие Вы хотите триггер повесить?
...
Рейтинг: 0 / 0
Динамическое сравнение полей таблицы в тригере
    #40073616
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Taraskrez
А может можно переменные NEW и OLD значение select-ом вибрать, типа так
select myOld, myNew from New,Old .....
Надо получать список таблиц из системных таблиц, см. доку на ibase.ru, там есть примеры запросов к системным таблицам, далее можно по аналогии получить список полей каждой таблиы, далее нагенерировать для каждой таблицы по 3 триггера на афтер события, триггеры пишут в логирующую таблицу. Как-то так у нас навешаны триггеры для репликатора.
...
Рейтинг: 0 / 0
Динамическое сравнение полей таблицы в тригере
    #40073621
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky,

А оно точно нужно - логирование всего и вся? Возможно хватит 2х-3х рукописных триггеров на ключевых таблицах? А так-то да - нагенерить можно. Только при изменении метаданных нужно будет перетряхивать все это хозяйство.
...
Рейтинг: 0 / 0
Динамическое сравнение полей таблицы в тригере
    #40073660
Taraskrez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
инструкции и примери запросов к системним таблицам я знаю и делаю, кстати в моем примере так и есть, но неполучается, а вот запихнуть execute block в execute statemen непробивал Вечером попробцю. Бланодарен за поиощь.
...
Рейтинг: 0 / 0
Динамическое сравнение полей таблицы в тригере
    #40073724
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster
А оно точно нужно - логирование всего и вся?
Для репликатора - точно.
...
Рейтинг: 0 / 0
Динамическое сравнение полей таблицы в тригере
    #40073745
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster
Только при изменении метаданных нужно будет перетряхивать все это хозяйство.
Дык оно автоматизировано, жмакнул кнопку - оно перетряхнулось. :)

DarkMaster
рукописных триггеров
Ошибок много, муторно такое писать каждый раз. Генератор лучше.
...
Рейтинг: 0 / 0
Динамическое сравнение полей таблицы в тригере
    #40073747
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Taraskrez
а вот запихнуть execute block в execute statemen
Надо просто открыть среду своего языка программирования и честно написать программу. Запрос, по нему перебор в цикле требуемых таблиц, получил по ним поля и создал скрипт для создания триггеров. Далее скрипт хоть в эксперте, хоть в isql применить к требуемой БД.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Динамическое сравнение полей таблицы в тригере
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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