|
|
|
Обращение к произвольному полю таблицы из тригера
|
|||
|---|---|---|---|
|
#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?fid=47&startmsg=38662400&tid=1834710]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
| others: | 202ms |
| total: | 333ms |

| 0 / 0 |
