Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
Подскажите новичку. У меня есть База MSSQL7 в ней таблица + к ней процедуры на добавление, обнавление, удаление. Клиент написан на Delphi4. Так вот когда я запускаю клиента на 2-х машинах и пытаюсь отредактировать одну и туже запись у меня это получается, а хотелось бы чтобы если один клиент редактировал другому выдовалось сообщение о блокировке записи, как это реализовать. Заранее большое спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2002, 19:58 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
1. Простое решение Я бы например завел бы дополнительную таблицу Locks(Record_ID, IS_Locked) или вставил бы поле IS_Locked в исходную таблицу (смотря как у вас база сделана). При выборе ВСЕХ записей, потенциально доступтых для редактирования, проверял бы поле IS_Locked = 0. Как только пользователь выбирает запись для редактирования - устанавливал бы IS_Locked = 1 Когда пользователь заканчивает редактирование или же нажимает Cancel - делал бы обратно IS_Locked = 0. Учтите, что это вещь опасная. А что если программа на стороне пользователя повисла или завершилась неверно? Блокировка записи останется в базе, и придется иметь утилитку, которая чистит все блокировки. 2. Более общее решение Есть конечно более общий подход - содать таблицу Locks (User_ID, Lock_Type, Lock_Data, Lock_Time, Lock_Expiration) где Lock_Type - тип блокирока (например 1="блокирока редактирования в таблице А", 2-"блокировка генерации отчета X"), Lock_Data - данные для блокировки (например, ID блокируемой записи для Lock_Type=1), Lock_Time - дата/время, когда блокирока была установлена, Lock_Expiration - дада/время когда блокирока должна быть снята НЕЗАВИСИМО НЕ ОТ ЧЕГО (например, вы не хотите блокировать запись дольше чем на 10 минут). Ну и работать с такой таблицей с помощью, например следующего набора хранимых процедур: IssueLock(@User_ID, @Lock_Type, @Lock_Data, @Lock_Timeout) - для создания блокировок RemoveLock(@User_ID, @Lock_Type, @Lock_Date) - для удаления блокировок (Function) IsLocked(@User_ID, @Lock_Type, @Lock_Data) - для проверки есть ли та или иная блокировка CleanExpiredLocks() - для очистки "ичтекших" блокировок Замечание: В IssueLock() Lock_Time = GetDate(), Lock_Expiration = Get_Date + Lock_Timeout Замечание (2): Процедуру CleanExpiredLocks() надо запускать по schedule периодически чтобы избежать "висящих" блокировок от некорректно работающих программ Я так делал и с таблицами такого типа работал - очень даже ничего получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2002, 14:36 |
|
||
|
Доступ к данным
|
|||
|---|---|---|---|
|
#18+
Я лично добавил к таблице поле useridedit int, по умолчанию оно =0, если пользователь заходит то присваиваю user_id() пользователя, когда заходит другой пользователь ему пишет что заблокировано пользователем user_name(useridedit), а для снятия "зависших блокировок" есть люди которые имеют право снять блокировку (запускают хранимую процедуру). Но выбор за Вами, в свое время я потратил около месяца чтобы определиться и все перепробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2002, 20:21 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32029802&tid=1822806]: |
0ms |
get settings: |
11ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
49ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 281ms |
| total: | 411ms |

| 0 / 0 |
