|
|
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
В тригерах можно обратиться к полям прямо в коде вписывая Pole.New и Pole.Old чтобы сравнить старое и новое значения. А если у меня название поля для сравнения находится в переменной @XX, могу ли я получить его значение через что-нибудь типа Fields[@XX].New ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2014, 18:19:02 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
InterSky, Нет. Разве что построением многоэтажных IF-ов или CASE-ов, с проверкой на равенство всех возможных вариантов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2014, 18:25:36 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
InterSkyВ тригерах можно обратиться к полям прямо в коде вписывая Pole.New и Pole.Old чтобы сравнить старое и новое значения. А если у меня название поля для сравнения находится в переменной @XX, могу ли я получить его значение через что-нибудь типа Fields[@XX].New ? чую запах бд, которую надо улучшать(структуру)! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2014, 19:26:39 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
А причём тут "БД которую надо улчучшать структурно"? Я просто хотел тригером отловить изменения в базе данных. В базе всего одна таблица. Изменений в неё вносится не много (от 100 до 1000 за сутки). Я считал что могу повесить на неё тригер, который при модификации данных на лету вытаскивает список всех послей (через show fields from MyTable), и потов в цикле проходит по всем полям, и сверяет .New и .Old чтобы определить какое поле изменилось, после чего название изменившегося поля, а так же старое и новое значения, скидываются в архив изменений (либо в файл, либо в отдельную таблицу). Прописать в тригере заранее проверку всех полей не могу, так как клиенты сами могут добавлять новые поля, и их несколько сотен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2014, 22:31:17 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
InterSkyтригер, который при модификации данных на лету вытаскивает список всех послейАга, и посадить производительность до уровня плинтуса. Имхо, более правильно периодически проверять структуру таблицы и, если она изменилась, производит перегенерацию кода триггера конкретной таблицы. А еще лучше эту перегенерацию встроить в тот код, через который происходит изменение структуры таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2014, 23:27:23 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
Прогнозируемую скорость "ниже плинтуса" можно уменьшить ещё во много раз, но даже такая не помешает при работе с базой в которую делается 100 изменений в течении суток... Так что это не пугает. Кстати, некоторые компоненты (например mySQLQuery из набора "DAC for MySQL" для Delphi) вообще после каждого выполненного Код: sql 1. делают ещё: Код: sql 1. 2. и ничего, живём... А что касается автоматической генерации тригера, то таблицу пользователи и сами могут поменять в любом клиенте, так что совместное изменение тригера и таблицы не возможно. Можно сдлать чтобы при запуске программы она сразу после подключения проверяла количество полей и сравнивала бы с тригером, но этот вариант мне кажетс таким (извините за выражение) геморойным. Во-первых, как выяснить что старый тригер не соответсвует текущему количеству полей (надо создавать механизм анализа тригера). Во-вторых, проблемы с доступом. Программы входят через один логин (где нельзя менять таблицы), а админы через другой пароль (а если он забудет что ему надо запустить модуль для замены тригера?). В-третьих, даже если дать всем возможность замены тригера при запуске программы, кто-то из спортивного интереса сломает программу и вставит такой тригер, что потом всю жизнь будешь жалет что дал такую возможность... И если честно ужасно удивило что в MySQL нельзя обратиться к полю таблицы когад оно есть у тебя в переменной. Такая ограниченность... :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 01:01:58 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
InterSkyВо-первых, как выяснить что старый тригер не соответсвует текущему количеству полей (надо создавать механизм анализа тригера).Это несложно. Заложите в структуру триггера сигнатуру таблицы, для которой он создан, например, результат SHOW COLUMNS. InterSkyПрограммы входят через один логин (где нельзя менять таблицы), а админы через другой пароль (а если он забудет что ему надо запустить модуль для замены тригера?).Можно код генерации триггера поместить в процедуру, которая будет вызваться с правами создавшего ее пользователя, а не вызвающего. InterSkyВ-третьих, даже если дать всем возможность замены тригера при запуске программы, кто-то из спортивного интереса сломает программу и вставит такой тригер, что потом всю жизнь будешь жалет что дал такую возможность...Сдуру можно и всю базу сломать. Можно и не взламывать ничего, а, например, переименовать какую-нибудь таблицу и все - ваша программа не работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 01:24:06 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
InterSkyИ если честно ужасно удивило что в MySQL нельзя обратиться к полю таблицы когад оно есть у тебя в переменной.А хоть в какой-нибудь другой СУБД так можно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 01:24:37 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
InterSkyпосле чего название изменившегося поля, а так же старое и новое значения, скидываются в архив измененийделайте таблицу истории с идентичной структурой и сбрасывайте туда всю запись с дельтами только голову себе заморочите InterSkyтаблицу пользователи и сами могут поменять в любом клиентеесли ваши клиенты такие умные, что им разрешенно менять структуру таблиц, то пусть они и триггер сами пишут miksoftInterSkyИ если честно ужасно удивило что в MySQL нельзя обратиться к полю таблицы когад оно есть у тебя в переменной.А хоть в какой-нибудь другой СУБД так можно?можно в любой СУБД, разрешающей динамический скл в триггерах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 08:16:15 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
авторделайте таблицу истории с идентичной структурой и сбрасывайте туда всю запись с дельтами только голову себе заморочите не прокатит, т.к. автортак как клиенты сами могут добавлять новые поля, и их несколько сотен. за...сь база ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 11:02:17 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
alex564657498765453InterSkyВ тригерах можно обратиться к полям прямо в коде вписывая Pole.New и Pole.Old чтобы сравнить старое и новое значения. А если у меня название поля для сравнения находится в переменной @XX, могу ли я получить его значение через что-нибудь типа Fields[@XX].New ? чую запах бд, которую надо улучшать(структуру)! +100 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 11:03:05 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
tanglirmiksoftА хоть в какой-нибудь другой СУБД так можно?можно в любой СУБД, разрешающей динамический скл в триггерахИ в этом динамическом SQL будут доступны NEW.col_name и OLD.col_name ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 12:30:54 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
читать т.к. мало кто пользуеться..многим интересно будет потом посмотреть твой код и узнать твои впечатления. успехов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 12:39:05 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
alex564657498765453, если что, твой случай генерировать стоки для получения кода Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 12:46:20 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
alex564657498765453 читать т.к. мало кто пользуеться..многим интересно будет потом посмотреть твой код и узнать твои впечатления. успехов.Нет, надо сразу читать это . К тому же, как верно указал миксофт, не факт, что в этом динамическом скл-е будут доступны ОЛД и НЬЮ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 13:03:01 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
tanglirК тому же, как верно указал миксофт, не факт, что в этом динамическом скл-е будут доступны ОЛД и НЬЮ.В случае с MySQL до этого даже дело не дойдет, т.к. динамический SQL в триггерах запрещен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 13:22:30 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
tangliralex564657498765453 читать т.к. мало кто пользуеться..многим интересно будет потом посмотреть твой код и узнать твои впечатления. успехов.Нет, надо сразу читать это . К тому же, как верно указал миксофт, не факт, что в этом динамическом скл-е будут доступны ОЛД и НЬЮ. может может. я никогда не пользовался таким... тогда только через задний проход таблица данных, такаяже таблица заявок(плюс свой автоинкремент). вместо обновления всегда заявка(вставка) по расписанию стартует код хранимой процедуры, который смотрит на заявку, ищет запись в таблице с такимже ключом если он указан, если нет там нул должен быть... и там точно динамические запросы можно будет. но это уже извращения. для динамически изменяемой таблицы (колчо столбцов) наверно лучше уж использовать соответсвующий патерн.(да и если юзеры сами добавляют столбцы, подзреваю если петя добавил размер, то не всем юзерам сразу этот столбик нужен!) ведь всётаки реляционая структура данных подразумевает динамически изменяемые данные а не самой структуры. хотя можно как и советовали выше, написать код который при изменении труктуры таблицы меняет и код тригера. ведь если уже и строить динамичский скл код то ни всёли равно - код вычисления или код тригера построить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 13:27:48 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
miksofttanglirК тому же, как верно указал миксофт, не факт, что в этом динамическом скл-е будут доступны ОЛД и НЬЮ.В случае с MySQL до этого даже дело не дойдет, т.к. динамический SQL в триггерах запрещен.ну я не зря же написал "разрешающей динамический скл в триггерах" и даже ссылку дал, где об этом говорится :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 13:57:50 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
tanglir, ааа, а я видать не заметил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 14:35:22 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
Я хотел только отметить, что я не говорил о "динамическом SQL'e", я говорил об обращении к произвольному полю уже полученной выборки. С моей точки зрения это большая разница! Одно дело на лету создать запрос (там кстати можно в программировании ошибиться и в некоторых случая такие запросы будут выполняться что база сразу умирать будет), и совершенно другое дело, когда у тебя на руках уже есть ответ (результат select'a), всего лишь извлечь из него нужное поле... А в данном случае речь даже не идёт об обращении к результату запроса, а об обращении к переменной окружения. Зачем запрещать это? Мне кажется логичным наличие в тригерах таких функций как: FieldCount - количество полей в изменяемой таблице FieldName(i) - получение имени поля введя его индекс (порядковый номер) FieldValueByName(s) - получение значения поля по его имени (или даже точнее Field New ValueByName и Field Old ValueByName) FieldValueByNumber(i) - получение значения поля по его порядковому номеру FieldParamByName(s,Val) - передача нового значения полю по имени FieldParamByNum(i,Val) - передача нового значения полю по его порядковому номеру А пока пошёл читать статьи, на которые вы дали ссыли... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 17:38:15 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 19:21:58 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
Вообще, безотносительно причины, вопрос интересный:) В MS SQL на этот случай есть COLUMNS_UPDATED (Transact-SQL) . Покопался в доках на MySQL - похожего не нашел... В общем-то не очень и надо, но если кто что знает - будет интересно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 22:41:01 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
> ты бы начал с того, а как ты инсерт делаешь в таблицу где неизвесно какие поля есть, а как апдейт??? Тут всё элементарно: Язык Delphi запрос типа: select * from MyTable Всё остальное делается само автоматически, таблица сама видит какие данные пришли (хоть 2 поля, хоть 200 полей), и изменение любой ячейки автоматом вызовет update, а при нажатии клавиши Insert появится новая строка для ввода новых данных. Считай что нету ни одной строчки кода. > может отуда и плясать..в клиентском коде делать и вставку в лог таблицу. обернув два действия в транкзанкцию.... Даже если не учитывать что работа идёт с нетранзакционной MyISAM, что например будет если пользователь случайно запустил старую версию моей программы вместо новой? Что будет если он вообще запустил не мою программу, а какой-то чужой клиент? > это всёравно что скзать, почему нету в Си функции getvarbyname. Может потому что Си - это компилятор? А интерпретаторы (да и вообще скриптовые языки типа того же PHP) имеют такие возможности. > в переменой у тебя изза ошибки может оказаться несуществующее поле, не то что ожидал и полетит всё к чортовой бабушке. Ну во-первых мне в данном случае вообще не нужны имена полей (разве что, для записи в лог). Я вполне могу обойтись циклом: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ну тоесть пробежался в цикле по всем полям, если были изменения - подобовлял их в переменную, а потом если переменная не пустая - закинул изменения в таблицу c историей изменений. Да и в принцепи мне кажется у вас неправильный взгляд на программирование. Ошибки могут быть всегда и везде. Но если вы на лету генерируете запрос, то у вас может получиться абы что, которое может либо выполняться 100 лет, либо уничтожит данные. А в случае если я обращусь к несуществующему имени, то либо получу Ошибку как если проиведу деление на ноль, либо функция вернёт мне пустую строку (хотя для этого удобней было бы что-то типа FieldValueByNameDef(s,Default) тоесть при существующем имени поля вернёт его значение, а при несуществующем имени поля вернёт значение по умолчанию введённое в Default, как наверно во всех языках программирования) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2014, 01:15:33 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
InterSky, а нахрена вам при такой постановке вопроса вообще нужны поля? Сделайте таблицу с одним полем и дуплите туда данные json-ом или чем-нибудь подобным. Вы ж всё равно на клиенте всё разбираете, ну дык и переносите тогда на него всю логику, ибо она у вас один хрен нереляционная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2014, 06:52:57 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
tanglirInterSky, а нахрена вам при такой постановке вопроса вообще нужны поля? Сделайте таблицу с одним полем и дуплите туда данные json-ом или чем-нибудь подобным. Вы ж всё равно на клиенте всё разбираете, ну дык и переносите тогда на него всю логику, ибо она у вас один хрен нереляционная.Супер ответ! Может ещё в текстовом файле хранить? Постановка моего вопроса касается исключительно возможности обратиться к произвольному полю внутри тригера. А что в вашем ответе? Я пишу что у меня клиент ничего не делает (и даже пользователь может использовать любой другой MySQL клиент для работы с базой), а вы тут пишите что у меня всё на клиенте разбирается. Или по вашему, если данные хранятся в одной таблице - значит им нечего делать в MySQL, там же нет реляционности и им никогда не потребуется ни сортировка, ни группировка для отчётов, никогда не появятся связи? (хотя тут уже нарисовалась связь с архивом изменений). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2014, 11:55:25 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38661879&tid=1834710]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
89ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 404ms |

| 0 / 0 |
