Způsob, jakým jsem to udělal v několika projektech, je použít dvě kopie tabulky v různých schématech. Takže něco jako:
CREATE SCHEMA fake WITH AUTHORIZATION dbo;
CREATE SCHEMA standby WITH AUTHORIZATION dbo;
GO
CREATE TABLE dbo.mySummary(<...columns...>);
CREATE TABLE fake.mySummary(<...columns...>);
GO
Nyní vytvořte uloženou proceduru, která zkrátí a znovu naplní falešnou tabulku, a poté v transakci přesunete objekty mezi schématy.
CREATE PROCEDURE dbo.SwapInSummary
AS
BEGIN
SET NOCOUNT ON;
TRUNCATE TABLE fake.mySummary;
INSERT fake.mySummary(<...columns...>)
SELECT <expensive query>;
BEGIN TRANSACTION;
ALTER SCHEMA standby TRANSFER dbo.mySummary;
ALTER SCHEMA dbo TRANSFER fake.mySummary;
ALTER SCHEMA fake TRANSFER standby.mySummary;
COMMIT TRANSACTION;
END
GO
Toto je pravděpodobně nejkratší doba, po kterou mohou uživatelé čekat na obnovení nových dat, aniž by je uprostřed čtení přerušili. (S NOLOCKem je spojeno mnoho problémů, které z něj dělají méně žádoucí alternativu, i když je pravda, že je snadné jej kódovat.) Pro stručnost/jasnost jsem vynechal zpracování chyb atd., a měl bych také zdůraznit, že pokud používáte skripty pro synchronizaci vašich databází, ujistěte se, že pojmenujete omezení, indexy atd. stejně v obou tabulkách, jinak budete polovinu času nesynchronizovaní. Na konci procedury můžete ZKRÁTIT novou tabulku fake.MySummary, ale pokud máte místo, rád tam data nechám, abych je mohl vždy porovnat s předchozí verzí.
Před SQL Server 2005 jsem použil sp_rename uvnitř transakce k provedení přesně stejné věci, ale protože to dělám v práci, byl jsem rád, že jsem přešel na schémata, protože když jsem to udělal, přestalo se vyplňovat nepotlačitelné varování z sp_rename nahoru mé protokoly historie SQL Server Agent.