SQL Server - Как автоматически удалять «старые» записи базы данных? - PullRequest
1 голос
/ 26 октября 2011

У меня есть таблица базы данных, в которой хранится список магазинов для пользователей.Я хочу сохранить только 12 списков магазинов для каждого пользователя. Это означает, что если в настоящее время user1 имеет 12 записей в таблице, как только user1 создаст новый список магазинов, первый список магазинов (самый старый) будет удален и новый список магазинов будет сохранен.

Таблица ShopList состоит из ShopListID (PK), UserID (FK) и воля LastUpdatedDate обновляется триггером, как только пользователь вставляет / удаляет любой элемент списка магазинов, принадлежащий списку магазинов.

Я получилпонятия не имею, как это сделать вообще .. это с помощью триггера?или хранимая процедура?очень нужна помощь здесь ...

Ценю любые отзывы .. Спасибо ...

Ответы [ 3 ]

1 голос
/ 26 октября 2011

Я бы лично изменил запрос на выбор, чтобы выбрать только первые 12, чтобы контролировать то, что может видеть пользователь.

Я бы тогда использовал задание базы данных, которое выполняется по расписанию, которое удаляет ненужные.

1 голос
/ 26 октября 2011

Я недавно сталкивался с этой проблемой, и она действительно зависит от вашей стратегии «архивирования».

Я сделал то, что создал хранимую процедуру, которая выбирает записи для последующего архивируемого элемента для каждого пользователя.аккаунт (мое требование очень похоже на ваше в том смысле, что я должен выбрать 31-й элемент в учетной записи пользователя).Я также могу дать вам некоторый код здесь, если вы считаете, что он пригодится.

Я создал дополнительную таблицу с именем XXXX_archive, которая является клоном схемы в ваших таблицах shopping_list.Это делается для того, чтобы вставить туда старые архивные записи на тот случай, если пользователь попросит получить свой список в будущем (это, очевидно, необязательно, но может пригодиться).

Хранимая процедура находит эти записи и вставляет их вXXXX_archive таблицы, а затем удаляет их из XXXX.Это выполняется каждую ночь (или всякий раз, когда вы считаете это необходимым) через агента SQL Server.

В результате 13-й элемент не удаляется в тот момент, когда пользователь создает другой список покупок, но я думаю, что это нормальнопотому что вы отвечаете за свою стратегию архивирования и можете описать ее в своем TOS.

Просто подумал, что я должен написать свой опыт здесь, потому что я разобрался с этой проблемой всего несколько дней назад.

РЕДАКТИРОВАТЬ: Мой сохраненный процесс выглядит следующим образом: :

INSERT into shopping_lists_archive
    SELECT *
    FROM shopping_lists 
    WHERE id in (
        select id
        from (
            SELECT ROW_NUMBER() OVER ( 
               PARTITION BY user_ID  
               ORDER BY user_ID desc) AS RowNumber,  
            id, user_ID
            FROM shopping_lists c
            where c.user_ID in (select USER_ID from shopping_lists group by user_id having COUNT(1) > 12)
        ) t
        where rownumber > 12
    )

DELETE FROM shopping_lists 
        WHERE id in (
            select id
            from (
                SELECT ROW_NUMBER() OVER ( 
                   PARTITION BY user_ID  
                   ORDER BY user_ID desc) AS RowNumber,  
                id, user_ID
                FROM shopping_lists c
                where c.user_ID in (select USER_ID from shopping_lists group by user_id having COUNT(1) > 12)
            ) t
            where rownumber > 12
        )

Вот и все - это может немного отличаться от того, что вам нужно, потому что я архивирую на основе объединения двух таблиц, и мне пришлось изменить мой оригинальныйзапрос к вашему требованию.

1 голос
/ 26 октября 2011

Вы можете сделать это через триггер или процедуру. Вы также можете в своем слое уровня обслуживания / бизнес-лигического уровня запросить счет при сохранении и удалить старые записи. Я за подход бизнес-логики, так как он более тестируемый и защищает бизнес-логику от триггеров или процедур, поэтому я рекомендую подход, основанный на коде.

...