Заблокировать запись пользователя и запретить редактирование? - PullRequest
0 голосов
/ 11 сентября 2018

во время работы над моим новым приложением клиенты возвращались ко мне с конкретными требованиями. Они хотели бы запретить нескольким пользователям редактировать одну и ту же запись одновременно. Например, если User 1 войти в приложение, найдите запись, а затем выберите запись. Существует несколько различных форм, которые показывают данные для выбранной записи. Например, это может быть демографическая форма, информация о семье и т. Д. Допустим, у нас есть User 2, который вошел в систему и выбрал одну и ту же запись. В этой ситуации мы хотели бы запретить им обоим редактировать любые формы одновременно. Мне интересно, подходит ли мой подход или есть что-то, что будет работать лучше. Я делаю следующее:

  • Пользователь выбирает запись, автоматически сохраняет эту запись в Lock таблице
  • Таблица блокировки имеет RecID (поле автоинкремента), UserID (уникальный идентификатор для каждого пользователя в системе), SelectedID (запись выбранного пользователя) и DateTime (метка времени)
  • Затем я отключаю все Edit кнопки в каждой форме на передней панели.
  • В конце я присоединяю таблицу блокировки к каждому запросу на обновление. Например:

    <cfquery name="updateDemo" datasource="#dsn#">
        Update dbo.Demographic
        Set LastName = 'Kelly',
            FirstName = 'Mike',
            DOB = '07/06/1967'
        From Demographic AS D
            Left Outer Join dbo.Lock AS L
                On L.SelectedID = D.SelectedID
        Where RecID = '123132'
             And L.UserID = Session.UserID
    </cfquery>
    

В запросе выше я присоединяюсь к таблице, которая будет обновлена ​​до Lock таблицы SelectedID. Таким образом, обновляется только выбранная запись, и мы удостоверяемся, что идентификатор пользователя в таблице блокировок совпадает с идентификатором пользователя сеанса. Пользователи могут разблокировать выбранную запись в любое время, нажав кнопку разблокировки в системе. Я не уверен, что этот метод лучший. Пока что я не могу найти никаких проблем, но этот код все еще находится в стадии разработки. Если у кого-то есть какие-либо предложения, пожалуйста, дайте мне знать. Я использую SQL 2008, ColdFusion 2016 с JQuery и Bootstrap 3 на внешнем интерфейсе.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Вот как я решил это в прошлом.

Для получения информации, которая потребует такого рода «блокировок», добавьте числовой столбец с именем «version».

Каждый раз, когда строка в этой таблице сохраняется, увеличивайте значение 'version' на 1.

Включите это значение в любую форму, используемую для редактирования таблицы.

Если пользователь A извлекает запись в то же время, что и пользователь B, но пользователь B сначала сохраняет информацию, «версия» будет другой, когда пользователь A отправит свою форму.

При отправке формы проверьте, что переданная «версия» соответствует «версии» из БД. Если это так ... обновите таблицу. Если он не перенаправляет пользователя в форму и не сообщает им, что они не обновляют самую последнюю «версию» данных, и дает им возможность загрузить обновленные данные.

0 голосов
/ 11 сентября 2018

Ваше решение должно работать, но звучит немного сложно.Я хотел бы:

  1. Добавить обновленный столбец At в демографическую таблицу и обновить его с помощью getdate () при сохранении.
  2. Добавьте в форму поле updatedAt и заполните его данными записи из таблицы.
  3. При обновлении убедитесь, что поле updatedAt в таблице совпадает с полем updatedAt в данных формы.Выдайте ошибку, если поле updatedAt в таблице новее, чем поле updatedAt в вашей форме.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...