Как сделать автоматическое архивирование данных в SQL Server? - PullRequest
3 голосов
/ 11 августа 2010

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

Я использую SQL Server 2005, я прочитал статью http://msdn.microsoft.com/en-us/library/ms345146(SQL.90).aspx, но не смог узнать, как я могу это сделать.написать функцию разделения, чтобы удовлетворить мои потребности.

Так что решение, которое, я надеюсь, существует, должно быть одноразовой конфигурацией, которая не потребует дальнейшего вмешательства.У вас есть предложения?

1 Ответ

3 голосов
/ 11 августа 2010

Вы можете легко сделать это с разделенными таблицами;Пример сценария ниже - он создает временную базу данных TestDB;если вы не хотите использовать его, измените базу данных на что-то другое.Он очищается в конце, если вы запускаете скрипт, как он создает базу данных;добавляет функцию разделения на основе Бита.Создает таблицу TestTable;применяется с функцией разделения Инертирует 3 «живые» строки в таблицу. Показывает, что все 3 строки находятся в одной из таблиц разделов путем выбора деталей из sys.partitions. Затем обновляет одну из записей, чтобы сделать ее архивированной. Повторно выбирает информацию из sys.partitions дляпоказать, что запись перемещена во вторую схему.

Все, что вам нужно сделать, это настроить процесс для архивирования записей.

USE master;
GO
--- Step 1 : Create New Test Database with two different filegroups.
IF EXISTS (
SELECT name
FROM sys.databases
WHERE name = N'TestDB')
DROP DATABASE TestDB;
GO
CREATE DATABASE TestDB
ON PRIMARY
(NAME='TestDB_Part1',
FILENAME=
'c:\sqldata\TestDB_Part1.mdf',
SIZE=3,
MAXSIZE=100,
FILEGROWTH=1 ),
FILEGROUP TestDB_Part2
(NAME = 'TestDB_Part2',
FILENAME =
'c:\sqldata\TestDB_Part2.ndf',
SIZE =3,
MAXSIZE=100,
FILEGROWTH=1 );
GO



USE TestDB;
GO
--- Step 2 : Create Partition Range Function
CREATE PARTITION FUNCTION TestDB_PartitionRange (Bit)
AS RANGE right FOR
VALUES (1);
GO

CREATE PARTITION SCHEME TestDB_PartitionScheme
AS PARTITION TestDB_PartitionRange
TO ([PRIMARY], TestDB_Part2);
GO


CREATE TABLE TestTable
(Archived Bit NOT NULL,
Date DATETIME)
ON TestDB_PartitionScheme (Archived);
GO


INSERT INTO TestTable (Archived, Date) 
VALUES (0,'2010-01-01');
INSERT INTO TestTable (Archived, Date) 
VALUES (0,'2010-02-01');
INSERT INTO TestTable (Archived, Date) 
VALUES (0,'2010-03-01');
GO

SELECT * FROM TestTable;


SELECT * FROM sys.partitions
WHERE OBJECT_NAME(OBJECT_ID)='TestTable';

update TestTable 
set Archived = 1 where Date = '2010-03-01'

SELECT * FROM sys.partitions
WHERE OBJECT_NAME(OBJECT_ID)='TestTable';


use master
go
drop database testdb
...