powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Обращение к произвольному полю таблицы из тригера
25 сообщений из 31, страница 1 из 2
Обращение к произвольному полю таблицы из тригера
    #38660541
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В тригерах можно обратиться к полям прямо в коде вписывая Pole.New и Pole.Old чтобы сравнить старое и новое значения.
А если у меня название поля для сравнения находится в переменной @XX, могу ли я получить его значение через что-нибудь типа Fields[@XX].New ?
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38660547
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSky,

Нет.
Разве что построением многоэтажных IF-ов или CASE-ов, с проверкой на равенство всех возможных вариантов.
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38660644
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSkyВ тригерах можно обратиться к полям прямо в коде вписывая Pole.New и Pole.Old чтобы сравнить старое и новое значения.
А если у меня название поля для сравнения находится в переменной @XX, могу ли я получить его значение через что-нибудь типа Fields[@XX].New ?

чую запах бд, которую надо улучшать(структуру)!
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38660781
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А причём тут "БД которую надо улчучшать структурно"?
Я просто хотел тригером отловить изменения в базе данных.
В базе всего одна таблица. Изменений в неё вносится не много (от 100 до 1000 за сутки). Я считал что могу повесить на неё тригер, который при модификации данных на лету вытаскивает список всех послей (через show fields from MyTable), и потов в цикле проходит по всем полям, и сверяет .New и .Old чтобы определить какое поле изменилось, после чего название изменившегося поля, а так же старое и новое значения, скидываются в архив изменений (либо в файл, либо в отдельную таблицу).
Прописать в тригере заранее проверку всех полей не могу, так как клиенты сами могут добавлять новые поля, и их несколько сотен.
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38660814
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSkyтригер, который при модификации данных на лету вытаскивает список всех послейАга, и посадить производительность до уровня плинтуса.

Имхо, более правильно периодически проверять структуру таблицы и, если она изменилась, производит перегенерацию кода триггера конкретной таблицы. А еще лучше эту перегенерацию встроить в тот код, через который происходит изменение структуры таблицы.
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38660857
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прогнозируемую скорость "ниже плинтуса" можно уменьшить ещё во много раз, но даже такая не помешает при работе с базой в которую делается 100 изменений в течении суток... Так что это не пугает.

Кстати, некоторые компоненты (например mySQLQuery из набора "DAC for MySQL" для Delphi) вообще после каждого выполненного
Код: sql
1.
SELECT * from Tablica

делают ещё:
Код: sql
1.
2.
SHOW INDEX FROM `Tablica`
DESCRIBE Tablica

и ничего, живём...

А что касается автоматической генерации тригера, то таблицу пользователи и сами могут поменять в любом клиенте, так что совместное изменение тригера и таблицы не возможно. Можно сдлать чтобы при запуске программы она сразу после подключения проверяла количество полей и сравнивала бы с тригером, но этот вариант мне кажетс таким (извините за выражение) геморойным. Во-первых, как выяснить что старый тригер не соответсвует текущему количеству полей (надо создавать механизм анализа тригера). Во-вторых, проблемы с доступом. Программы входят через один логин (где нельзя менять таблицы), а админы через другой пароль (а если он забудет что ему надо запустить модуль для замены тригера?). В-третьих, даже если дать всем возможность замены тригера при запуске программы, кто-то из спортивного интереса сломает программу и вставит такой тригер, что потом всю жизнь будешь жалет что дал такую возможность...

И если честно ужасно удивило что в MySQL нельзя обратиться к полю таблицы когад оно есть у тебя в переменной.
Такая ограниченность... :(
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38660864
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSkyВо-первых, как выяснить что старый тригер не соответсвует текущему количеству полей (надо создавать механизм анализа тригера).Это несложно. Заложите в структуру триггера сигнатуру таблицы, для которой он создан, например, результат SHOW COLUMNS.
InterSkyПрограммы входят через один логин (где нельзя менять таблицы), а админы через другой пароль (а если он забудет что ему надо запустить модуль для замены тригера?).Можно код генерации триггера поместить в процедуру, которая будет вызваться с правами создавшего ее пользователя, а не вызвающего.
InterSkyВ-третьих, даже если дать всем возможность замены тригера при запуске программы, кто-то из спортивного интереса сломает программу и вставит такой тригер, что потом всю жизнь будешь жалет что дал такую возможность...Сдуру можно и всю базу сломать. Можно и не взламывать ничего, а, например, переименовать какую-нибудь таблицу и все - ваша программа не работает.
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38660865
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSkyИ если честно ужасно удивило что в MySQL нельзя обратиться к полю таблицы когад оно есть у тебя в переменной.А хоть в какой-нибудь другой СУБД так можно?
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38660924
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSkyпосле чего название изменившегося поля, а так же старое и новое значения, скидываются в архив измененийделайте таблицу истории с идентичной структурой и сбрасывайте туда всю запись
с дельтами только голову себе заморочите
InterSkyтаблицу пользователи и сами могут поменять в любом клиентеесли ваши клиенты такие умные, что им разрешенно менять структуру таблиц, то пусть они и триггер сами пишут
miksoftInterSkyИ если честно ужасно удивило что в MySQL нельзя обратиться к полю таблицы когад оно есть у тебя в переменной.А хоть в какой-нибудь другой СУБД так можно?можно в любой СУБД, разрешающей динамический скл в триггерах
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38661091
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторделайте таблицу истории с идентичной структурой и сбрасывайте туда всю запись
с дельтами только голову себе заморочите
не прокатит, т.к.
автортак как клиенты сами могут добавлять новые поля, и их несколько сотен.
за...сь база
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38661092
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453InterSkyВ тригерах можно обратиться к полям прямо в коде вписывая Pole.New и Pole.Old чтобы сравнить старое и новое значения.
А если у меня название поля для сравнения находится в переменной @XX, могу ли я получить его значение через что-нибудь типа Fields[@XX].New ?

чую запах бд, которую надо улучшать(структуру)!
+100
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38661234
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirmiksoftА хоть в какой-нибудь другой СУБД так можно?можно в любой СУБД, разрешающей динамический скл в триггерахИ в этом динамическом SQL будут доступны NEW.col_name и OLD.col_name ?
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38661256
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
читать

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

если что, твой случай генерировать стоки для получения кода
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@fname = 'field1'; -- get it from table structure
set @stmp = CONCAT("set @fold = OLD.",@fname,"; set @fnew = NEW",@fname,";");

PREPARE stmt2 FROM @stmp ;

EXECUTE stmt2;

IF @fold <> @fnew 
THEN
 INSERT INTO archive(fname,fold,fnew) values (@fname,@fold,@fnew);
END IF;
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38661312
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453 читать

т.к. мало кто пользуеться..многим интересно будет потом посмотреть твой код и узнать твои впечатления. успехов.Нет, надо сразу читать это . К тому же, как верно указал миксофт, не факт, что в этом динамическом скл-е будут доступны ОЛД и НЬЮ.
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38661349
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirК тому же, как верно указал миксофт, не факт, что в этом динамическом скл-е будут доступны ОЛД и НЬЮ.В случае с MySQL до этого даже дело не дойдет, т.к. динамический SQL в триггерах запрещен.
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38661361
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tangliralex564657498765453 читать

т.к. мало кто пользуеться..многим интересно будет потом посмотреть твой код и узнать твои впечатления. успехов.Нет, надо сразу читать это . К тому же, как верно указал миксофт, не факт, что в этом динамическом скл-е будут доступны ОЛД и НЬЮ.

может может. я никогда не пользовался таким...

тогда только через задний проход

таблица данных, такаяже таблица заявок(плюс свой автоинкремент). вместо обновления всегда заявка(вставка)
по расписанию стартует код хранимой процедуры, который смотрит на заявку, ищет запись в таблице с такимже ключом если он указан, если нет там нул должен быть... и там точно динамические запросы можно будет.

но это уже извращения.
для динамически изменяемой таблицы (колчо столбцов)
наверно лучше уж

использовать соответсвующий патерн.(да и если юзеры сами добавляют столбцы, подзреваю если петя добавил размер, то не всем юзерам сразу этот столбик нужен!)

ведь всётаки реляционая структура данных подразумевает динамически изменяемые данные а не самой структуры.

хотя можно как и советовали выше, написать код который при изменении труктуры таблицы меняет и код тригера. ведь если уже и строить динамичский скл код то ни всёли равно - код вычисления или код тригера построить.
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38661415
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksofttanglirК тому же, как верно указал миксофт, не факт, что в этом динамическом скл-е будут доступны ОЛД и НЬЮ.В случае с MySQL до этого даже дело не дойдет, т.к. динамический SQL в триггерах запрещен.ну я не зря же написал "разрешающей динамический скл в триггерах"
и даже ссылку дал, где об этом говорится :)
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38661473
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir,

ааа, а я видать не заметил.
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38661746
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я хотел только отметить, что я не говорил о "динамическом SQL'e", я говорил об обращении к произвольному полю уже полученной выборки. С моей точки зрения это большая разница! Одно дело на лету создать запрос (там кстати можно в программировании ошибиться и в некоторых случая такие запросы будут выполняться что база сразу умирать будет), и совершенно другое дело, когда у тебя на руках уже есть ответ (результат select'a), всего лишь извлечь из него нужное поле... А в данном случае речь даже не идёт об обращении к результату запроса, а об обращении к переменной окружения. Зачем запрещать это?
Мне кажется логичным наличие в тригерах таких функций как:
FieldCount - количество полей в изменяемой таблице
FieldName(i) - получение имени поля введя его индекс (порядковый номер)
FieldValueByName(s) - получение значения поля по его имени (или даже точнее Field New ValueByName и Field Old ValueByName)
FieldValueByNumber(i) - получение значения поля по его порядковому номеру
FieldParamByName(s,Val) - передача нового значения полю по имени
FieldParamByNum(i,Val) - передача нового значения полю по его порядковому номеру

А пока пошёл читать статьи, на которые вы дали ссыли...
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38661879
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSkyЯ хотел только отметить, что я не говорил о "динамическом SQL'e", я говорил об обращении к произвольному полю уже полученной выборки. С моей точки зрения это большая разница! Одно дело на лету создать запрос (там кстати можно в программировании ошибиться и в некоторых случая такие запросы будут выполняться что база сразу умирать будет), и совершенно другое дело, когда у тебя на руках уже есть ответ (результат select'a), всего лишь извлечь из него нужное поле... А в данном случае речь даже не идёт об обращении к результату запроса, а об обращении к переменной окружения. Зачем запрещать это?
Мне кажется логичным наличие в тригерах таких функций как:
FieldCount - количество полей в изменяемой таблице
FieldName(i) - получение имени поля введя его индекс (порядковый номер)
FieldValueByName(s) - получение значения поля по его имени (или даже точнее Field New ValueByName и Field Old ValueByName)
FieldValueByNumber(i) - получение значения поля по его порядковому номеру
FieldParamByName(s,Val) - передача нового значения полю по имени
FieldParamByNum(i,Val) - передача нового значения полю по его порядковому номеру

А пока пошёл читать статьи, на которые вы дали ссыли...

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

ты бы начал с того, а как ты инсерт делаешь в таблицу где неизвесно какие поля есть, а как апдейт???

может отуда и плясать..в клиентском коде делать и вставку в лог таблицу. обернув два действия в транкзанкцию....

это всёравно что скзать, почему нету в Си функции getvarbyname.
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38661980
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, безотносительно причины, вопрос интересный:)
В MS SQL на этот случай есть COLUMNS_UPDATED (Transact-SQL) .

Покопался в доках на MySQL - похожего не нашел... В общем-то не очень и надо, но если кто что знает - будет интересно :)
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38662075
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> ты бы начал с того, а как ты инсерт делаешь в таблицу где неизвесно какие поля есть, а как апдейт???
Тут всё элементарно:
Язык Delphi
запрос типа: select * from MyTable
Всё остальное делается само автоматически, таблица сама видит какие данные пришли (хоть 2 поля, хоть 200 полей), и изменение любой ячейки автоматом вызовет update, а при нажатии клавиши Insert появится новая строка для ввода новых данных. Считай что нету ни одной строчки кода.


> может отуда и плясать..в клиентском коде делать и вставку в лог таблицу. обернув два действия в транкзанкцию....
Даже если не учитывать что работа идёт с нетранзакционной MyISAM, что например будет если пользователь случайно запустил старую версию моей программы вместо новой? Что будет если он вообще запустил не мою программу, а какой-то чужой клиент?


> это всёравно что скзать, почему нету в Си функции getvarbyname.
Может потому что Си - это компилятор? А интерпретаторы (да и вообще скриптовые языки типа того же PHP) имеют такие возможности.


> в переменой у тебя изза ошибки может оказаться несуществующее поле, не то что ожидал и полетит всё к чортовой бабушке.
Ну во-первых мне в данном случае вообще не нужны имена полей (разве что, для записи в лог). Я вполне могу обойтись циклом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
BEGIN;
DECLARE i INT DEFAULT 0;
DECLARE s TEXT DEFAULT '';
WHILE i<FieldCount DO
      if FieldNewValueByNumber(i)<>FieldOldValueByNumber(i) 
         then s := s + concat_ws(FieldName(i),' Old:',FieldOldValueByNumber(i),' New:',FieldNewValueByNumber(i),'\r\n');
      SET i := i + 1;
      END WHILE;
if s<>'' then insert into LogTable (TableID,ChangeTime,OldNewValues) values (ID,Now(),s);
END;

ну тоесть пробежался в цикле по всем полям, если были изменения - подобовлял их в переменную, а потом если переменная не пустая - закинул изменения в таблицу c историей изменений.

Да и в принцепи мне кажется у вас неправильный взгляд на программирование. Ошибки могут быть всегда и везде. Но если вы на лету генерируете запрос, то у вас может получиться абы что, которое может либо выполняться 100 лет, либо уничтожит данные. А в случае если я обращусь к несуществующему имени, то либо получу Ошибку как если проиведу деление на ноль, либо функция вернёт мне пустую строку (хотя для этого удобней было бы что-то типа FieldValueByNameDef(s,Default) тоесть при существующем имени поля вернёт его значение, а при несуществующем имени поля вернёт значение по умолчанию введённое в Default, как наверно во всех языках программирования)
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38662124
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSky, а нахрена вам при такой постановке вопроса вообще нужны поля? Сделайте таблицу с одним полем и дуплите туда данные json-ом или чем-нибудь подобным. Вы ж всё равно на клиенте всё разбираете, ну дык и переносите тогда на него всю логику, ибо она у вас один хрен нереляционная.
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38662393
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirInterSky, а нахрена вам при такой постановке вопроса вообще нужны поля? Сделайте таблицу с одним полем и дуплите туда данные json-ом или чем-нибудь подобным. Вы ж всё равно на клиенте всё разбираете, ну дык и переносите тогда на него всю логику, ибо она у вас один хрен нереляционная.Супер ответ! Может ещё в текстовом файле хранить?
Постановка моего вопроса касается исключительно возможности обратиться к произвольному полю внутри тригера. А что в вашем ответе?
Я пишу что у меня клиент ничего не делает (и даже пользователь может использовать любой другой MySQL клиент для работы с базой), а вы тут пишите что у меня всё на клиенте разбирается.
Или по вашему, если данные хранятся в одной таблице - значит им нечего делать в MySQL, там же нет реляционности и им никогда не потребуется ни сортировка, ни группировка для отчётов, никогда не появятся связи? (хотя тут уже нарисовалась связь с архивом изменений).
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Обращение к произвольному полю таблицы из тригера
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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