MSSQL, Bir Veritabanını Klonlama (Boş Bir Şekilde)

MSSQL, Bir Veritabanını Klonlama (Boş Bir Şekilde)

Merhaba Bloğuma nadir bir şekilde yolu düşen insanlar, bir projede düzenli bir iş olarak bir Veritabanı’nı boş bir şekilde yeniden kurmam gerekti. Neden diye sormayın anlatması 6 Saat sürer. Gecenin saat 5 inde bunu yazdıktan sonra kaydetmeden kapatmak olmaz. Burada ki amacım, bir veritabanında bulunan tüm tabloları aynı şekilde yeni bir veritabanına akarmak böylelikle projem için örneğin bir test veritabanı oluşturabilmiş olacağım, elli kere backup al restore et işlemi ile uğraşmamış olacağım. Aşağıda Direkt kodu paylaşıyorum. Ekleme yapmak isteyen, “ya kardeş şunu da ekle” diyen varsa yorumlara beklerim.

DECLARE @OriginalDBName NVARCHAR(128) = 'ANA_VERTABANI';
DECLARE @NewDBName NVARCHAR(128) = 'KLON_VERITABANI_ADI';


DECLARE @Guid uniqueidentifier = NEWID()
DECLARE @createTempTable nvarchar(max) = 'CREATE DATABASE ' + QUOTENAME(REPLACE(@Guid, '-', ''))
EXEC sp_executesql @createTempTable

SET @createTempTable = 'CREATE TABLE ' + QUOTENAME(REPLACE(@Guid, '-', '')) + '.[dbo].[HRB_AKTARILACAK_TABLOLAR](isim nvarchar(max))'
EXEC sp_executesql @createTempTable

DECLARE @tabloEsitleme nvarchar(max) = 'INSERT INTO ' + QUOTENAME(REPLACE(@Guid, '-', '')) + '.dbo.HRB_AKTARILACAK_TABLOLAR (isim) SELECT [name] FROM ' + QUOTENAME(@OriginalDBName) + '.sys.tables WHERE schema_id = 1'
EXEC sp_executesql @tabloEsitleme

SET @createTempTable = 'SELECT * FROM ' + QUOTENAME(REPLACE(@Guid, '-', '')) + '.[dbo].[HRB_AKTARILACAK_TABLOLAR]'

DECLARE @tablo table(isim nvarchar(max))
INSERT INTO @tablo EXEC sp_executesql @createTempTable


-- Yeni veritabanını oluştur
DECLARE @SQL NVARCHAR(MAX) = 'CREATE DATABASE ' + QUOTENAME(@NewDBName);
EXEC(@SQL);

WHILE (SELECT COUNT(*) FROM @tablo) > 0
BEGIN 
	DECLARE @cursor nvarchar(max)
	SELECT TOP(1) @cursor = isim FROM @tablo 

		-- Orijinal veritabanındaki tüm tabloların şemalarını al
	SET @SQL = 'SELECT * INTO ' + QUOTENAME(@NewDBName) + '.[dbo].[' + @cursor + '] FROM ' + QUOTENAME(@OriginalDBName) + '.[dbo].[' + @cursor + '] WHERE 1 = 0;';
	EXEC sp_executesql @SQL;

	DELETE FROM @tablo WHERE isim = @cursor
END


SET @createTempTable = 'DROP DATABASE ' + QUOTENAME(REPLACE(@Guid, '-', ''))
EXEC sp_executesql @createTempTable

SELECT 'OK'
Paylaş :

Bu gönderiyi paylaş

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.