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'
Bir yanıt yazın