Могу ли я сбросить ChangeId в Cache Table для уведомления об изменениях - PullRequest
0 голосов
/ 15 сентября 2011

Что произойдет, если я сброслю значение changeId в таблице

AspNet_SqlCacheTablesForChangeNotification

Одна из строк в настоящее время доведена до 2х миллиардов, и наши обновления не выполняются Я попытался изменить тип на BigInt, но чтение приложения не удается. Мне нужно сбросить их на 0. Это нормально? Будут ли проблемы?

1 Ответ

3 голосов
/ 28 февраля 2012

Быстрый ответ ... да.Мы недавно столкнулись с этой проблемой и имели тот же вопрос.У ряда сайтов, которые я нашел, остались вопросы без ответов по этому поводу.После большой охоты у меня не было выбора, кроме как просто пойти на это.Вот что я сделал, и это сработало просто отлично.

Существует обновление, вызываемое триггером, добавленным к одной или нескольким вашим таблицам.Должно выглядеть так:

EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N'YourTableName '

Эта хранимая процедура использует не столбец идентификаторов, а обычный столбец INT и обновляется при помощи changeId = changeId + 1,Как только значение MAX достигнуто, оно, ну, взорвется.Измените этот оператор UPDATE следующим образом:

Замените:

SET changeId = changeId + 1

На:

SET changeId =
    CASE
        WHEN changeId = 2147483647  --Max INT
        THEN 1
        ELSE changeId + 1
    END

Он должен выглядеть следующим образом:

ALTER PROCEDURE [dbo].[AspNet_SqlCacheUpdateChangeIdStoredProcedure] 
         @tableName NVARCHAR(450) 
     AS

     BEGIN 
         UPDATE dbo.AspNet_SqlCacheTablesForChangeNotification WITH (ROWLOCK) 
         SET changeId = 
            CASE 
                WHEN changeId = 2147483647 -- Max INT
                THEN 1
                ELSE changeId + 1 
            END
         WHERE tableName = @tableName
     END
...