powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Обращение к произвольному полю таблицы из тригера
31 сообщений из 31, показаны все 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
Обращение к произвольному полю таблицы из тригера
    #38662400
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSky,

Ну нащот Си ты не совсем верно сказал, но главное в правильную сторону посмотрел.

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

тоесть просто поиск переменой по имени теряет смысл, вместо этого ищуться данные по адресу.

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

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

есть масив байт, представляющих большое целое число(свой собственый тип) - я вот делал для шифрования. но в арифметике естественно складывая такие числа в столбик лучше не по байту а по 8 байт сразу обрабатывать...никто не мешает...
тоесть как бы функционал априори есть и по шире пхпшного $$var, можно сделать на подобе
$$var[4] - по адресу где даные переменой взять 5ый байт.

ну дык вот.

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

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

=====
у тебя интересная задачка... сам порой гуглю и думаю как бы это сделать покрасивше.

пока у меня мысли такие.

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

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

3)при желании менять структуру, вызываем процедуру1, которая меняет структуру, и вызывает процедуру2 для пересоздания тригера.
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38662406
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSkyСупер ответ! Может ещё в текстовом файле хранить?Поскольку вашу БД может насиловать любой желающий, причём каким угодно способом, то можно и в текстовом файле. Хуже всё равно не будет.
InterSkyИли по вашему, если данные хранятся в одной таблице - значит им нечего делать в MySQL, там же нет реляционности"Если данные хранятся в одной таблице"... но они-то у вас хранятся по факту в разных таблицах (название у них одно, но структура изменяется по любому поводу).


InterSkyЯ пишу что у меня клиент ничего не делает (и даже пользователь может использовать любой другой MySQL клиент для работы с базой), а вы тут пишите что у меня всё на клиенте разбирается.Вот это
InterSky
Код: 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;

на сервере работать не будет, о чём вам уже несколько раз сказали. Значит, этим должен заниматься клиент, если уж возникла такая насущная необходимость в подобных плясках на костылях. По-моему, это совершенно очевидно.
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38662413
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453пока у меня мысли такие.+1
сама идея давать пользователю права на alter выглядит безумно
должна быть хранимка, которая выполнит этот альтер и все сопутствующие ему действия
но если уж и давать ему такие права, то объяснить, что последствия запуска самопальных скриптов - его личная головная боль
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38662914
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tangliralex564657498765453пока у меня мысли такие.+1
сама идея давать пользователю права на alter выглядит безумно
должна быть хранимка, которая выполнит этот альтер и все сопутствующие ему действия
но если уж и давать ему такие права, то объяснить, что последствия запуска самопальных скриптов - его личная головная больА ведь Вы пока еще не слышали, что с базой одновременно работает до 1000 пользователей, и почти каждый настраивает эту таблицу "под себя"

Я, правда, тоже пока не слышал, но... надеюсь...
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38663740
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007А ведь Вы пока еще не слышали, что с базой одновременно работает до 1000 пользователей, и почти каждый настраивает эту таблицу "под себя"
Я, правда, тоже пока не слышал, но... надеюсь...Примерно так и есть, около 1000 пользователей, только не с "этой базой одновременно", а каждый со своей базой работает (ну или иногда несколько пользователей на отдел).


tanglirсама идея давать пользователю права на alter выглядит безумноВы опять не внимательно читаете. Права на изменения имеют только админы (и это было мною написано). Нажать 2 нопки для создания нового поля может любой админ, даже тот кто не знает что такое "select" (причём кто-то привык это делать в одном клиенте MySQL, а кто-то в другом), а вот, как вы сказали, "запускать самопальные скрипты" никто не будет...


tanglir...FieldNewValueByNumber...
на сервере работать не будет, о чём вам уже несколько раз сказали. Значит, этим должен заниматься клиент, если уж возникла такая насущная необходимость в подобных плясках на костылях.То что в MySQL пока ещё нету подобной функции, я понял уже после первого ответа. А код я привёл в пример только для того чтобы показать как просто и изящно можно было бы реализовать Log'ирование изменений всего в несколько строк, вместо мыканья и пыканья которое необходимо будет произвести сейчас, прописывая отдельно сравнение каждого поля (и если скажем в базе 300 полей, то и код будет минимум на 300 строк).
Я уже понял что что для вас любые тригеры и продцедуры - это пляска на костылях, и будь у вас воля, вы наверняка запретили бы их, как источник потенциальной опасности. Остаётся лишь вспомнить, что "люди не любят то, чем не умеют пользоваться". Возможно вы лучший в мире планировщик реляционных баз данных, но программирования боитесь...
А по поводу озвученных мною функций (которые я считаю появятся в MySQL в ближайшее время), лишь поправлюсь, что всё же зря сказал о Field New ValueByNumber и Field Old ValueByNumber, конечно будет просто FieldValueByNumber и FieldValueByName, а в тригерах будут работать конструкции типа OLD.FieldValueByName(...) и NEW.FieldValueByName(...)


tanglirInterSkyИли по вашему, если данные хранятся в одной таблице - значит им нечего делать в MySQL, там же нет реляционности"Если данные хранятся в одной таблице"... но они-то у вас хранятся по факту в разных таблицах (название у них одно, но структура изменяется по любому поводу).У каждого пользователя своя таблица, и эти таблицы ни как не связаны между собой. Кому-то надо 3 дополнительных поля для хранения цвета автомобиля, а кому-то надо несколько полей чтобы описать тип грунда в который можно сеять семена данного вида рассады.


tanglirInterSkyСупер ответ! Может ещё в текстовом файле хранить?Поскольку вашу БД может насиловать любой желающий, причём каким угодно способом, то можно и в текстовом файле. Хуже всё равно не будет.Насилывать вы можете кого угодно, а администраторы подстраивают базы под нужды своих пользоваетелей. И ваше предложение - "хранить всё в одном поле", это просто бред... Заявления типа - "Эту базу ведь можно изменить!", не являются основанием для того чтобы отказываться от удобства работы с отдельными полями, их сортировкой, группировкой, и другим набором функционала предлагаемым базами данных MySQL.


alex564657498765453тоесть как бы функционал априори есть и по шире пхпшного $$var, можно сделать на подобеПро адресация я всё знаю (больше 20 лет на Delphi пишу). Но я бы хотел отметить что если вы говорите о $$var , то вы не правильно поняли то чего я хотел. Я не говорю о доступе к любой переменной, а только к переменным окружения! Тоесть если сравнивать с РНР, то это не $$var, а обращение к $_GET['Var1']; вместо $Var1;

А целом, вместо переписывания тригеров я пока остановился на вашем варианте
Код: sql
1.
set @stmp = CONCAT("set @fold = OLD.",@fname,"; set @fnew = NEW.",@fname,";");
...
Рейтинг: 0 / 0
Обращение к произвольному полю таблицы из тригера
    #38663818
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSky,

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

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

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

событие каждые 5 секунд можете запускать.

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

для этого использую get_lock, free_lock на сгенерированом для каждой хранимки|события GUID.
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Обращение к произвольному полю таблицы из тригера
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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