powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Проверка TimeStamp при Update
15 сообщений из 15, страница 1 из 1
Проверка TimeStamp при Update
    #32472870
vl2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первая программа на 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 (есть и такие извращенцы :).
...
Рейтинг: 0 / 0
Проверка TimeStamp при Update
    #32472977
DarkUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хммм... я-бы сделал так(чур ногами не бить):

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

теперь, для проверки изменения посылаем запись, с сохраненным временем, и если ексепшн, то перечитываем

тока ИМХО сложноватый способ проверки... помойму лучше уж ё блокировать пока она редактируется(опять-же ИМХО :)...
...
Рейтинг: 0 / 0
Проверка TimeStamp при Update
    #32473004
vl2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>DarkUser
Что то внутренний голос мне говорит, что вот эта финтефлюшка:

new.ts = "new"
или
new.ts = current_timestamp

не сработает. Блин, как назло, ни одного "прохожего" :)
...
Рейтинг: 0 / 0
Проверка TimeStamp при Update
    #32473060
DarkUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нэ понил, а почему это не сработает?!?
или мой внутренний голос ще проснутся не успел??
...
Рейтинг: 0 / 0
Проверка TimeStamp при Update
    #32473155
vl2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может быть потому, что new.ts это поле таблицы, а что бы изменить значение поля в SQL используется Update.........SET......
Хотя это моё сугубо личное мнение :)
...
Рейтинг: 0 / 0
Проверка TimeStamp при Update
    #32473184
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
господа, могу заверить, у вас ничего не выйдет....
почитайте про транзакции.....
есть полезный сайт www.ibase.ru
...
Рейтинг: 0 / 0
Проверка TimeStamp при Update
    #32473229
DarkUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гррррр...
>может быть потому, что new.ts это поле таблицы, а что бы изменить значение >поля в SQL используется Update.........SET......

а new и old в триггерах для красоты что-ль???

или тебе из клиента нада апдейтить? тада для апдейта мона посылать НАЛЛ-овую дату/время, и соотв проверятть в триггере

>господа, могу заверить, у вас ничего не выйдет....
>почитайте про транзакции.....
если тока после каждого апдейта CommitRetaining не делать...
...
Рейтинг: 0 / 0
Проверка TimeStamp при Update
    #32473602
vl2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я хотел сделать следующее:
1. В поле ДатаВремя содержится время последнего обновления файла (т.е. при Инсерте или Апдайте оно должно изменяться на Current_DateTime).
2. Я беру запись на редактирование на клиента. Никаких транзакций при этом не начинается.
3. На клиенте правлю данные (ДатаВремя естественно не трогаю, оно остается старым)
4. Далее, клиент посылает на сервер измененные данные для Апдейта (Кроме ДатаВремя, оно осталось не измененным)
5. В тригере проверяется, изменилось ли время модификации (сравниваются ДатаВремя, котороя я брал на редактирование с тем, которое сейчас находится в базе)
6. Если время не изменилось, значит за время моего редактирования запись никто не правил, и Апдейт проходит.
7. Если изменилось, то исключение и его обработка (сообщение пользователю, что запись изменена, перечитать её и т.д.)

Проблема в том, что в п.6 я должен во время Апдейта еще изменить и поле ДатаВремя на новое. А это не получается. Если это делать, Апдейтом, то опять срабатывает тот же самый триггер (рекурсия), а так как ДатаВремя уже разное- возникает исключение и откат.
Вот я никак и не въеду (а я вообще- большой тугодум :), на форуме не раз читал, что этот тип поля используется для контроля, а как это сделать- ?
Можно, конечно, и через SET TRANSACTION SNAPSHOT, или "Пустого Апдейта", но с другой стороны- это увеличивает время транзакции.
...
Рейтинг: 0 / 0
Проверка TimeStamp при Update
    #32474182
DarkUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vl2000
Я беру запись на редактирование на клиента. Никаких транзакций при этом не начинается.

в смысле - кроме той, в которой берешь?? :)

vl2000
Проблема в том, что в п.6 я должен во время Апдейта еще изменить и поле ДатаВремя на новое. А это не получается. Если это делать, Апдейтом, то опять срабатывает тот же самый триггер (рекурсия), а так как ДатаВремя уже разное- возникает исключение и откат.

вот для этого и используется new .ts = ' new '
при этом второй раз триггер НЕ ВЫЗОВЕТСЯ!!!

vl2000
Можно, конечно, и через SET TRANSACTION SNAPSHOT, или "Пустого Апдейта", но с другой стороны- это увеличивает время транзакции.

не думаю, что пользователь, сильно обрадуется СнапШуту, а "Пустой Апдейт" помойму куда быстрее, чем каждый раз Commit делать (иначе новой даты-та и не видно будет в другой транзакции, как тут напомнили :) )

vl2000(а я вообще- большой тугодум :),
угу, я то-же, так-что где я ошибся??
...
Рейтинг: 0 / 0
Проверка TimeStamp при Update
    #32474222
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Атас.

Для проверки, не менял ли кто запись, можно задействовать всекие там компоненты, типа TQuery, например. См. свойство UpdateMode. (F1)
Все уже давным-давно придумано и работает незаметно от программиста.
...
Рейтинг: 0 / 0
Проверка TimeStamp при Update
    #32474229
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vl2000

Ты понял?
...
Рейтинг: 0 / 0
Проверка TimeStamp при Update
    #32474263
Matt Juntunen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для блокировки записи от изменений применяю поле статуса. Работает замечательно. Алгоритм здесь:
http://]http://www.ibase.ru/devinfo/plocks.htm
...
Рейтинг: 0 / 0
Проверка TimeStamp при Update
    #32474524
vl2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не братцы, чё то мы друг друга не поймем. :)

>mv
>...компоненты, типа TQuery..

Клиент на Фоксе80, какие уж тут TQuery :)


>Тёмному

Транзакция начинается, когда будет команда:
nrlt=SQLEXEC(nCon,"Update aaa SET b=12")

Ладно, всем спасибо, закругляю эту бодягу.
...
Рейтинг: 0 / 0
Проверка TimeStamp при Update
    #32474528
vl2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Должен просить прощения у 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 за ссылку, там и прочитал
...
Рейтинг: 0 / 0
Проверка TimeStamp при Update
    #32474530
vl2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё, разум меня покинул.
Работает с 'now'
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Проверка TimeStamp при Update
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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