Cara saya melakukan ini dalam beberapa proyek adalah dengan menggunakan dua salinan tabel dalam skema yang berbeda. Jadi sesuatu seperti:
CREATE SCHEMA fake WITH AUTHORIZATION dbo;
CREATE SCHEMA standby WITH AUTHORIZATION dbo;
GO
CREATE TABLE dbo.mySummary(<...columns...>);
CREATE TABLE fake.mySummary(<...columns...>);
GO
Sekarang buat prosedur tersimpan yang memotong dan mengisi ulang tabel palsu, lalu dalam transaksi pindahkan objek antar skema.
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
Ini mungkin waktu tersingkat yang Anda dapat membuat pengguna menunggu data baru di-refresh dan tanpa mengganggu mereka di tengah pembacaan. (Ada banyak masalah yang terkait dengan NOLOCK yang menjadikannya alternatif yang kurang diinginkan, meskipun harus diakui, mudah untuk dikodekan.) Untuk singkatnya/kejelasan saya telah mengabaikan penanganan kesalahan dll., dan saya juga harus menunjukkan bahwa jika Anda menggunakan skrip untuk menyinkronkan database Anda, pastikan Anda memberi nama batasan, indeks, dll. Sama di kedua tabel, jika tidak, Anda akan tidak sinkron separuh waktu. Di akhir prosedur, Anda dapat MEMOTONG tabel fake.MySummary baru, tetapi jika Anda memiliki ruang, saya ingin meninggalkan data di sana sehingga saya selalu dapat membandingkan dengan versi sebelumnya.
Sebelum SQL Server 2005 saya menggunakan sp_rename di dalam transaksi untuk mencapai hal yang persis sama, namun karena saya melakukan ini dalam pekerjaan, saya senang beralih ke skema, karena ketika saya melakukannya, peringatan yang tidak dapat ditekan dari sp_rename berhenti mengisi up log riwayat SQL Server Agent saya.