Charlie brown 711 Ответов: 0

Как не разрешить пользователям просматривать одни и те же записи


привет,

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

Спасибо, что проголосовали против. Я рад, что у меня было вдохновение улучшить ваш неясный вопрос.

0 Ответов