|
|
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#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 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
InterSky, Ну нащот Си ты не совсем верно сказал, но главное в правильную сторону посмотрел. в си нету такой команды, ибо принцип для языка си, пишем код, переводим в машиный код, где уже есть жосткие рамки. и подобное не возможно технически... ибо уже нету понятия переменных. есть понятие адреса. образно говоря, компилятор в разделе обьявлений переменую а увидел, выкупил по какому адресу она будет храниться у него(он ведь сам упаковывает в облать памятя данных все переменные и прочую лабуду) и дальше по коду везде вместо "а" поставит адрес в память. тоесть просто поиск переменой по имени теряет смысл, вместо этого ищуться данные по адресу. в своем коде вместо запоминания имени а, получаешь (в си собачка) адрес переменой а, а потом где надо обращаешься в память по адресу. тоесть команды нету, ибо она какбы не нужна... понятие переменой на этапе выполнения нету, только адрес. а с адресами мож делать что хочешь... знаешь адрес четырёхбайтного числа, бери делай указатель на байт и щитывай побайтово. есть масив байт, представляющих большое целое число(свой собственый тип) - я вот делал для шифрования. но в арифметике естественно складывая такие числа в столбик лучше не по байту а по 8 байт сразу обрабатывать...никто не мешает... тоесть как бы функционал априори есть и по шире пхпшного $$var, можно сделать на подобе $$var[4] - по адресу где даные переменой взять 5ый байт. ну дык вот. реляционная модель - это не модель асоциативного масива. это модель предполагает, что на этапе выполнения уже нету понятия добавить столбик в таблицу..это на этапе проектирования(написания кода на си) - на этапе выполнения уже жостко. да можно делать, добавлять - в си для этого есть динамическая память куда суй сколько хочешь на этапе выполнения, в базах - каманды по модификации структуры. но это уже тогда не надо ожидать, что будет одна функция которая всё за тебя сделает. ввести такую функцию можно - беспорно, как и в языке си можно сделать что б влюбом месте можно было воткнуть переменую новую, и оно само потом сделало код по выделению памяти динамической и всю лабуду... но зачем? да иногда надо, но в большинстве случаев зачем? а при серьёзных проектах это будет ещо и источник ошибок - снижение строгости языка. ===== у тебя интересная задачка... сам порой гуглю и думаю как бы это сделать покрасивше. пока у меня мысли такие. 1)добавление удаление столбиков - только через хранимую процедуру(юзеру запрещаешь команду альтер...на случай поддержки старого клиента это гемор.) это надо просто изза того что на альтер тейбл нельзя вешать тригер, а нам точно надо делать дополнительные телодвижения 2)есть другая хранимка, которая может щитать содержимое таблицы(набор полей) и построить текст тригера, который по парно сверит старое-новое значение всех полей и сделает вставку в лог 3)при желании менять структуру, вызываем процедуру1, которая меняет структуру, и вызывает процедуру2 для пересоздания тригера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2014, 12:00:42 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
InterSkyСупер ответ! Может ещё в текстовом файле хранить?Поскольку вашу БД может насиловать любой желающий, причём каким угодно способом, то можно и в текстовом файле. Хуже всё равно не будет. InterSkyИли по вашему, если данные хранятся в одной таблице - значит им нечего делать в MySQL, там же нет реляционности"Если данные хранятся в одной таблице"... но они-то у вас хранятся по факту в разных таблицах (название у них одно, но структура изменяется по любому поводу). InterSkyЯ пишу что у меня клиент ничего не делает (и даже пользователь может использовать любой другой MySQL клиент для работы с базой), а вы тут пишите что у меня всё на клиенте разбирается.Вот это InterSky Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. на сервере работать не будет, о чём вам уже несколько раз сказали. Значит, этим должен заниматься клиент, если уж возникла такая насущная необходимость в подобных плясках на костылях. По-моему, это совершенно очевидно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2014, 12:06:19 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
alex564657498765453пока у меня мысли такие.+1 сама идея давать пользователю права на alter выглядит безумно должна быть хранимка, которая выполнит этот альтер и все сопутствующие ему действия но если уж и давать ему такие права, то объяснить, что последствия запуска самопальных скриптов - его личная головная боль ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2014, 12:10:15 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
tangliralex564657498765453пока у меня мысли такие.+1 сама идея давать пользователю права на alter выглядит безумно должна быть хранимка, которая выполнит этот альтер и все сопутствующие ему действия но если уж и давать ему такие права, то объяснить, что последствия запуска самопальных скриптов - его личная головная больА ведь Вы пока еще не слышали, что с базой одновременно работает до 1000 пользователей, и почти каждый настраивает эту таблицу "под себя" Я, правда, тоже пока не слышал, но... надеюсь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2014, 19:29:29 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2014, 15:25:30 |
|
||
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#18+
InterSky, я не проверял, но тангир давал ссылку на доку, где написано что в тригере нельзя использовать эту конструкцию - динамический запрос. и хранимку нельзя вызвать ,если в ней есть динамические запросы или транкзанкции. так что похоже надо будет остановиться на моём втором варианте который , вроде тотже тангир отметил плюсом. переписывание тригера. можно сделать событие которое стартует каждый период=Период и проверяет, не было ли изменений в структуре таблицы(посмотри в информационую базу, там для таблиц есть время подификации последней, по этому критерию можно определять, если бы, такимже конкатом сформировать новый тригер.) событие каждые 5 секунд можете запускать. ЗЫ лично я для событий страхуюсь - не допустить повторный запуск, тем более что у меня на событие каждое есть и хранимка с аналогичным кодом...чтоб вручную запускать. для этого использую get_lock, free_lock на сгенерированом для каждой хранимки|события GUID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2014, 16:01:28 |
|
||
|
|

start [/forum/topic.php?all=1&fid=47&tid=1834710]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
83ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
| others: | 240ms |
| total: | 418ms |

| 0 / 0 |
