Как не разрешить пользователям просматривать одни и те же записи
привет,
How to not allow users to view same records
напр.
в таблице у меня есть следующие записи
один
б
с
д
е
ф
г
х
Я хочу получать записи по страницам
скажем 4 записи на страницу
пользователь x выбирает
один
б
с
д
Теперь пользователь y не должен выбирать ничего из вышеперечисленного
е
ф
г
х
пользователь X обрабатывает записи говорят, что запись б
теперь он должен увидеть
один
е
с
д
и пользователь y должен видеть
ф
г
х
я
как я могу это сделать, есть ли какой-либо встроенный способ в mssql?
Что я уже пробовал:
написал для этого хранимую процедуру sql,
использование базы данных adventureworks
SQL-сервер-образцы/образцы/базы данных/приключения-сочинения по мастер · на Microsoft SQL-сервер-образцы · в GitHub[^]
<pre>ALTER Procedure [dbo].[AllocateRecords2] (@UserID INT, @PageSize INT, @PageNumber INT ) AS BEGIN DECLARE @Today DATETIME SET @Today = GETDATE() --de-allocated expired items --TRUNCATE TABLE AllocatedRecords DELETE FROM AllocatedRecords WHERE IsProcessed = 0 AND AllocatedToUser = @UserID AND DATEDIFF(minute, @Today, AllocatedDate) > 5 DECLARE @Draw INT SET @Draw = 10 DECLARE @PoolSize INT SET @PoolSize = @PageSize DECLARE @CurrentRecords INT SELECT @CurrentRecords = Count(*) from AllocatedRecords WHERE AllocatedToUser = @UserID AND IsProcessed = 0 IF @CurrentRecords = 0 BEGIN SET @Draw = @PoolSize END ELSE IF @CurrentRecords < @PoolSize BEGIN SET @Draw = @PoolSize - @CurrentRecords END ELSE IF @CurrentRecords >= @PoolSize BEGIN SET @Draw = 0 END SELECT ProductID as ReferenceID,0 as IsProcessed,@UserID as AllocatedToUser, GETDATE() as AllocatedDate,null as ProcessedDate INTO #TMP from [Production].[Product] WHERE ProductID not in ( SELECT ReferenceID from AllocatedRecords WHERE IsProcessed = 1 ) --deallocate all not processed --DELETE FROM AllocatedRecords --WHERE IsProcessed = 0 AND AllocatedToUser = @UserID SELECT * INTO #TMP2 FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY AllocatedDate ) AS RowNum, ReferenceID, IsProcessed, AllocatedToUser, AllocatedDate, ProcessedDate FROM #TMP ) AS RowConstrainedResult WHERE RowNum BETWEEN ((@PageNumber - 1) * @PageSize + 1) AND (@PageNumber * @PageSize) ORDER BY RowNum INSERT INTO AllocatedRecords SELECT TOP(@Draw) ReferenceID, IsProcessed, AllocatedToUser, AllocatedDate, ProcessedDate FROM #TMP2 WHERE ReferenceID NOT IN ( SELECT ReferenceID FROM AllocatedRecords ) SELECT * FROM AllocatedRecords WHERE AllocatedToUser = @UserID and IsProcessed = 0 --update AllocatedRecords SET IsProcessed = 1 where referenceid=975 SELECT COUNT(1) as TotalRecords from #TMP END
Christiaan van Bergen
Вам нужно следить за тем, кто читал и кто обрабатывал то, что. Покажите нам вашу попытку в хранимой процедуре. Какой подход вы испробовали?
Charlie brown 711
проверьте обновленные вопрос,
Я написал СП,
однако я чувствую, что есть лучший способ, чем этот
Christiaan van Bergen
Как долго вы хотите, чтобы распределение продолжалось? Другими словами: если пользователь X видит первые 4 строки, но не обрабатывает их, сколько времени пройдет, прежде чем другой пользователь сможет их увидеть и обработать?
Charlie brown 711
5 минут
Maciej Los
Спасибо, что проголосовали против. Я рад, что у меня было вдохновение улучшить ваш неясный вопрос.