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

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

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

Имхо, более правильно периодически проверять структуру таблицы и, если она изменилась, производит перегенерацию кода триггера конкретной таблицы. А еще лучше эту перегенерацию встроить в тот код, через который происходит изменение структуры таблицы.
...
Рейтинг: 0 / 0
04.06.2014, 01:01:58
    #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
04.06.2014, 01:24:06
    #38660864
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к произвольному полю таблицы из тригера
InterSkyВо-первых, как выяснить что старый тригер не соответсвует текущему количеству полей (надо создавать механизм анализа тригера).Это несложно. Заложите в структуру триггера сигнатуру таблицы, для которой он создан, например, результат SHOW COLUMNS.
InterSkyПрограммы входят через один логин (где нельзя менять таблицы), а админы через другой пароль (а если он забудет что ему надо запустить модуль для замены тригера?).Можно код генерации триггера поместить в процедуру, которая будет вызваться с правами создавшего ее пользователя, а не вызвающего.
InterSkyВ-третьих, даже если дать всем возможность замены тригера при запуске программы, кто-то из спортивного интереса сломает программу и вставит такой тригер, что потом всю жизнь будешь жалет что дал такую возможность...Сдуру можно и всю базу сломать. Можно и не взламывать ничего, а, например, переименовать какую-нибудь таблицу и все - ваша программа не работает.
...
Рейтинг: 0 / 0
04.06.2014, 01:24:37
    #38660865
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к произвольному полю таблицы из тригера
InterSkyИ если честно ужасно удивило что в MySQL нельзя обратиться к полю таблицы когад оно есть у тебя в переменной.А хоть в какой-нибудь другой СУБД так можно?
...
Рейтинг: 0 / 0
04.06.2014, 08:16:15
    #38660924
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к произвольному полю таблицы из тригера
InterSkyпосле чего название изменившегося поля, а так же старое и новое значения, скидываются в архив измененийделайте таблицу истории с идентичной структурой и сбрасывайте туда всю запись
с дельтами только голову себе заморочите
InterSkyтаблицу пользователи и сами могут поменять в любом клиентеесли ваши клиенты такие умные, что им разрешенно менять структуру таблиц, то пусть они и триггер сами пишут
miksoftInterSkyИ если честно ужасно удивило что в MySQL нельзя обратиться к полю таблицы когад оно есть у тебя в переменной.А хоть в какой-нибудь другой СУБД так можно?можно в любой СУБД, разрешающей динамический скл в триггерах
...
Рейтинг: 0 / 0
04.06.2014, 11:02:17
    #38661091
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к произвольному полю таблицы из тригера
авторделайте таблицу истории с идентичной структурой и сбрасывайте туда всю запись
с дельтами только голову себе заморочите
не прокатит, т.к.
автортак как клиенты сами могут добавлять новые поля, и их несколько сотен.
за...сь база
...
Рейтинг: 0 / 0
04.06.2014, 11:03:05
    #38661092
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к произвольному полю таблицы из тригера
alex564657498765453InterSkyВ тригерах можно обратиться к полям прямо в коде вписывая Pole.New и Pole.Old чтобы сравнить старое и новое значения.
А если у меня название поля для сравнения находится в переменной @XX, могу ли я получить его значение через что-нибудь типа Fields[@XX].New ?

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

т.к. мало кто пользуеться..многим интересно будет потом посмотреть твой код и узнать твои впечатления. успехов.
...
Рейтинг: 0 / 0
04.06.2014, 12:46:20
    #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
04.06.2014, 13:03:01
    #38661312
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к произвольному полю таблицы из тригера
alex564657498765453 читать

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

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

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

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

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

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

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

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

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

ааа, а я видать не заметил.
...
Рейтинг: 0 / 0
04.06.2014, 17:38:15
    #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
04.06.2014, 19:21:58
    #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
04.06.2014, 22:41:01
    #38661980
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к произвольному полю таблицы из тригера
Вообще, безотносительно причины, вопрос интересный:)
В MS SQL на этот случай есть COLUMNS_UPDATED (Transact-SQL) .

Покопался в доках на MySQL - похожего не нашел... В общем-то не очень и надо, но если кто что знает - будет интересно :)
...
Рейтинг: 0 / 0
05.06.2014, 01:15:33
    #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
05.06.2014, 06:52:57
    #38662124
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к произвольному полю таблицы из тригера
InterSky, а нахрена вам при такой постановке вопроса вообще нужны поля? Сделайте таблицу с одним полем и дуплите туда данные json-ом или чем-нибудь подобным. Вы ж всё равно на клиенте всё разбираете, ну дык и переносите тогда на него всю логику, ибо она у вас один хрен нереляционная.
...
Рейтинг: 0 / 0
05.06.2014, 11:55:25
    #38662393
InterSky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к произвольному полю таблицы из тригера
tanglirInterSky, а нахрена вам при такой постановке вопроса вообще нужны поля? Сделайте таблицу с одним полем и дуплите туда данные json-ом или чем-нибудь подобным. Вы ж всё равно на клиенте всё разбираете, ну дык и переносите тогда на него всю логику, ибо она у вас один хрен нереляционная.Супер ответ! Может ещё в текстовом файле хранить?
Постановка моего вопроса касается исключительно возможности обратиться к произвольному полю внутри тригера. А что в вашем ответе?
Я пишу что у меня клиент ничего не делает (и даже пользователь может использовать любой другой MySQL клиент для работы с базой), а вы тут пишите что у меня всё на клиенте разбирается.
Или по вашему, если данные хранятся в одной таблице - значит им нечего делать в MySQL, там же нет реляционности и им никогда не потребуется ни сортировка, ни группировка для отчётов, никогда не появятся связи? (хотя тут уже нарисовалась связь с архивом изменений).
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Обращение к произвольному полю таблицы из тригера / 25 сообщений из 31, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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