Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Проверка TimeStamp при Update / 15 сообщений из 15, страница 1 из 1
08.04.2004, 01:53
    #32472870
vl2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка TimeStamp при Update
Первая программа на 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
08.04.2004, 08:51
    #32472977
DarkUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка TimeStamp при Update
Хммм... я-бы сделал так(чур ногами не бить):

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
08.04.2004, 09:09
    #32473004
vl2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка TimeStamp при Update
>DarkUser
Что то внутренний голос мне говорит, что вот эта финтефлюшка:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


>Тёмному

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

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


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