|
|
|
Проверка TimeStamp при Update
|
|||
|---|---|---|---|
|
#18+
Первая программа на IB. Так что, хлопцы, извиняйте. В таблице есть поле TS типа TimeStamp, для проверки, не изменил ли кто нибудь запись, пока я её редактировал. Получаю значение этого поля на клиента, в курсор. Редактирую курсор. Пишу обратно в таблицу на сервер (со старым значением поля TimeStamp, что бы проверить, не изменилось ли оно). У таблицы есть триггер, где и осуществляется проверка: CREATE TRIGGER GR_PODST_BU1 FOR GR_PODST ACTIVE BEFORE UPDATE POSITION 1 AS begin if (old.ts <> new.ts ) then exception main_exception ; end А где мне теперь сделать Апдейт поля TS на Current_timestamp (что бы запомнить дату изменения)? Ведь если я буду делать какие то изменения, то где бы я их не делал, опять сработает этот триггер, но старое и новое значения равны уже не будут, возникнет исключение и Update окончится неудачей. IB60, клиент на Фоксе №8 (есть и такие извращенцы :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2004, 01:53 |
|
||
|
Проверка TimeStamp при Update
|
|||
|---|---|---|---|
|
#18+
Хммм... я-бы сделал так(чур ногами не бить): CREATE TRIGGER GR_PODST_BU1 FOR GR_PODST ACTIVE BEFORE UPDATE POSITION 1 AS begin if (old.ts <> new.ts ) then exception main_exception ; else new.ts = "new" <-- end теперь, для проверки изменения посылаем запись, с сохраненным временем, и если ексепшн, то перечитываем тока ИМХО сложноватый способ проверки... помойму лучше уж ё блокировать пока она редактируется(опять-же ИМХО :)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2004, 08:51 |
|
||
|
Проверка TimeStamp при Update
|
|||
|---|---|---|---|
|
#18+
>DarkUser Что то внутренний голос мне говорит, что вот эта финтефлюшка: new.ts = "new" или new.ts = current_timestamp не сработает. Блин, как назло, ни одного "прохожего" :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2004, 09:09 |
|
||
|
Проверка TimeStamp при Update
|
|||
|---|---|---|---|
|
#18+
нэ понил, а почему это не сработает?!? или мой внутренний голос ще проснутся не успел?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2004, 09:42 |
|
||
|
Проверка TimeStamp при Update
|
|||
|---|---|---|---|
|
#18+
может быть потому, что new.ts это поле таблицы, а что бы изменить значение поля в SQL используется Update.........SET...... Хотя это моё сугубо личное мнение :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2004, 10:31 |
|
||
|
Проверка TimeStamp при Update
|
|||
|---|---|---|---|
|
#18+
господа, могу заверить, у вас ничего не выйдет.... почитайте про транзакции..... есть полезный сайт www.ibase.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2004, 10:42 |
|
||
|
Проверка TimeStamp при Update
|
|||
|---|---|---|---|
|
#18+
Гррррр... >может быть потому, что new.ts это поле таблицы, а что бы изменить значение >поля в SQL используется Update.........SET...... а new и old в триггерах для красоты что-ль??? или тебе из клиента нада апдейтить? тада для апдейта мона посылать НАЛЛ-овую дату/время, и соотв проверятть в триггере >господа, могу заверить, у вас ничего не выйдет.... >почитайте про транзакции..... если тока после каждого апдейта CommitRetaining не делать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2004, 11:08 |
|
||
|
Проверка TimeStamp при Update
|
|||
|---|---|---|---|
|
#18+
Я хотел сделать следующее: 1. В поле ДатаВремя содержится время последнего обновления файла (т.е. при Инсерте или Апдайте оно должно изменяться на Current_DateTime). 2. Я беру запись на редактирование на клиента. Никаких транзакций при этом не начинается. 3. На клиенте правлю данные (ДатаВремя естественно не трогаю, оно остается старым) 4. Далее, клиент посылает на сервер измененные данные для Апдейта (Кроме ДатаВремя, оно осталось не измененным) 5. В тригере проверяется, изменилось ли время модификации (сравниваются ДатаВремя, котороя я брал на редактирование с тем, которое сейчас находится в базе) 6. Если время не изменилось, значит за время моего редактирования запись никто не правил, и Апдейт проходит. 7. Если изменилось, то исключение и его обработка (сообщение пользователю, что запись изменена, перечитать её и т.д.) Проблема в том, что в п.6 я должен во время Апдейта еще изменить и поле ДатаВремя на новое. А это не получается. Если это делать, Апдейтом, то опять срабатывает тот же самый триггер (рекурсия), а так как ДатаВремя уже разное- возникает исключение и откат. Вот я никак и не въеду (а я вообще- большой тугодум :), на форуме не раз читал, что этот тип поля используется для контроля, а как это сделать- ? Можно, конечно, и через SET TRANSACTION SNAPSHOT, или "Пустого Апдейта", но с другой стороны- это увеличивает время транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2004, 13:31 |
|
||
|
Проверка TimeStamp при Update
|
|||
|---|---|---|---|
|
#18+
vl2000 Я беру запись на редактирование на клиента. Никаких транзакций при этом не начинается. в смысле - кроме той, в которой берешь?? :) vl2000 Проблема в том, что в п.6 я должен во время Апдейта еще изменить и поле ДатаВремя на новое. А это не получается. Если это делать, Апдейтом, то опять срабатывает тот же самый триггер (рекурсия), а так как ДатаВремя уже разное- возникает исключение и откат. вот для этого и используется new .ts = ' new ' при этом второй раз триггер НЕ ВЫЗОВЕТСЯ!!! vl2000 Можно, конечно, и через SET TRANSACTION SNAPSHOT, или "Пустого Апдейта", но с другой стороны- это увеличивает время транзакции. не думаю, что пользователь, сильно обрадуется СнапШуту, а "Пустой Апдейт" помойму куда быстрее, чем каждый раз Commit делать (иначе новой даты-та и не видно будет в другой транзакции, как тут напомнили :) ) vl2000(а я вообще- большой тугодум :), угу, я то-же, так-что где я ошибся?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2004, 17:12 |
|
||
|
Проверка TimeStamp при Update
|
|||
|---|---|---|---|
|
#18+
Атас. Для проверки, не менял ли кто запись, можно задействовать всекие там компоненты, типа TQuery, например. См. свойство UpdateMode. (F1) Все уже давным-давно придумано и работает незаметно от программиста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2004, 17:26 |
|
||
|
Проверка TimeStamp при Update
|
|||
|---|---|---|---|
|
#18+
2 vl2000 Ты понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2004, 17:28 |
|
||
|
Проверка TimeStamp при Update
|
|||
|---|---|---|---|
|
#18+
Для блокировки записи от изменений применяю поле статуса. Работает замечательно. Алгоритм здесь: http://]http://www.ibase.ru/devinfo/plocks.htm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2004, 17:41 |
|
||
|
Проверка TimeStamp при Update
|
|||
|---|---|---|---|
|
#18+
Не братцы, чё то мы друг друга не поймем. :) >mv >...компоненты, типа TQuery.. Клиент на Фоксе80, какие уж тут TQuery :) >Тёмному Транзакция начинается, когда будет команда: nrlt=SQLEXEC(nCon,"Update aaa SET b=12") Ладно, всем спасибо, закругляю эту бодягу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2004, 21:07 |
|
||
|
Проверка TimeStamp при Update
|
|||
|---|---|---|---|
|
#18+
Должен просить прощения у DarkUser, его код работает, вот в таком виде: CREATE TRIGGER GR_PODST_BU FOR GR_PODST ACTIVE BEFORE UPDATE POSITION 1 AS begin if (old.ts <> new.ts ) then exception main_exception ; else new.ts='now' ; end Только вместо 'now' надо писать 'new'. Спасибо Matt Juntunen за ссылку, там и прочитал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2004, 21:17 |
|
||
|
|

start [/forum/topic.php?fid=40&tid=1578869]: |
0ms |
get settings: |
7ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
179ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 212ms |
| total: | 502ms |

| 0 / 0 |
