SQL Server’da Tüm Tabloları Silmek

Merhaba, bu makalemde SQL Server üzerindeki bir veritabanında bulunan tüm tabloların sorgular yardımıyla nasıl silineceğini yazacağım. Bu konuyla alakalı olarak akla gelen en kısa ve basit yöntem veritabanını silip yeniden oluşturmak oluyor. Aslında doğru, en kısa yöntem o; ancak gözden kaçan iki şey var: birincisi, veritabanında sadece tablolar yoksa ne yapacağız, yani veritabanında view, sp, fonksiyon gibi başka objeler de varsa veritabanını silip yeniden oluşturmamız daha zahmetli olacaktır. İkincisi ise eğer benim gibi müşteri ortamında çalışıyorsanız ve yetki konusunda çok cimrilerse dolayısıyla size veritabanını silme yetkisi vermiyorlar. O yüzden aşağıdaki anlatacağım işlemler bazen hayat kurtarıcı olabiliyor.

!!! Sorguları çalıştırmadan önce ilgili veritabanını seçtiğinizden emin olun. !!!

 

Tablolar arası ilişkileri silmek

     Tabloları silebilmemiz için öncelikle aralarındaki ilişkileri silmemiz gerekiyor. Tablolar birbirleri ile bağlantılı olduğunda sadece uygun sıra ile bu tabloları silebiliyoruz ve eğer sizin de 200 küsür tablonuz varsa ve bu tablolar arasındaki ilişkiler içinden çıkılamayacak gibiyse öncelikli olarak bu ilişkileri silmemiz gerekiyor.

     Tablolar arasındaki ilişkilerin tamamını silmek için aşağıdaki sorguyu çalıştırıyoruz:

DECLARE @Sql NVARCHAR(500)
DECLARE @Cursor CURSOR
SET @Cursor = CURSOR FAST_FORWARD FOR
 
SELECT DISTINCT sql = 'ALTER TABLE [' + TableCons.TABLE_NAME +
    '] DROP [' + ReferentialCons.CONSTRAINT_NAME + ']'
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS ReferentialCons
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TableCons
ON TableCons.CONSTRAINT_NAME = ReferentialCons.CONSTRAINT_NAME
 
OPEN @Cursor FETCH NEXT FROM @Cursor INTO @Sql
WHILE (@@FETCH_STATUS = 0)
BEGIN
    Exec SP_EXECUTESQL @Sql
    FETCH NEXT FROM @Cursor INTO @Sql
END
CLOSE @Cursor DEALLOCATE @Cursor
GO
 
 Evet, yukarıdaki sorguyu çalıştırdığımızda tüm tablolarımız birbirinden bağımsız hale gelecek ve istediğimiz şekilde istediğimiz tabloyu silebilir hale geleceğiz. İlişkileri sildik, gelelim tabloları silmeye.
Tabloları silmek

     Tablolarınızın sayısı 3 – 5 tane ise SQL Server Management Studio arayüzü üzerinden tek tek silebilirsiniz veya yine tek tek silmek için her tabloya DROP komutunu uygulayabilirsiniz; ancak tablo sayınız yeterince fazlaysa veya uğraşmak istemiyorum diyorsanız aşağıdaki sorguyu çalıştırmanız yeterli:

EXEC sp_MSForEachTable 'DROP TABLE ?'
GO

 

   Bu şekilde tüm tablolarımızı silmiş olduk. Amacınız tabloları silmektiyse görevinizi tamamlamış oldunuz. Elbette ki yazıyı okumaya devam edebilirsiniz…

View’ları silmek

     Eğer tabloları silmekle işiniz bitmediyse veya view’ların tamamını silmek istiyorsanız o zaman başka bir sorguya ihtiyacınız olacak. İlgili sorguyu aşağıda bulabilirsiniz:

DECLARE @query VARCHAR(MAX) = '';
SELECT @query = @query + 'DROP VIEW [' + name + '];' FROM sys.views;
EXEC(@query);
Stored Procedure’leri silmek

     Tablo ve view’ların nasıl silindiğini paylaştım. Sırada SP’lerin nasıl silindiği var. SP’leri silmek için cursor kullanmamız gerekiyor. Yani bir nevi foreach döngüsü gibi düşünebilirsiniz. İlgili sorgu aşağıda:

DECLARE @procedureName VARCHAR(500)
DECLARE cur CURSOR
 
FOR SELECT [name] FROM sys.objects WHERE TYPE = 'p'
OPEN cur
FETCH NEXT FROM cur INTO @procedureName
 
WHILE @@fetch_status = 0
BEGIN
    EXEC('DROP PROCEDURE ' + @procedureName)
    FETCH NEXT FROM cur INTO @procedureName
END
 
CLOSE cur
DEALLOCATE cur

 Fonksiyonları silmek

     Son olarak fonksiyonları silmek için gerekli sorgu kaldı. Bu sorgu SP’leri silmek için kullanılan sorgu ile çok benzer. Sadece iki yerde değişiklik yapmak gerekiyor. İlgili sorgu aşağıda:

DECLARE @functionName VARCHAR(500)
DECLARE cur CURSOR
 
FOR SELECT [name] FROM sys.objects WHERE TYPE = 'fn'
OPEN cur
FETCH NEXT FROM cur INTO @functionName
 
WHILE @@fetch_status = 0
BEGIN
    EXEC('DROP FUNCTION ' + @functionName)
    FETCH NEXT FROM cur INTO @functionName
END
 
CLOSE cur
DEALLOCATE cur
 

     Böylelikle tüm objeleri silmiş olduk. Yukarıdaki sorguların tümünü bir dosyaya kaydedip çalıştırırsanız veritabanınızdaki her şeyi silmiş olursunuz (kullanıcılar hariç). Çok sık lazım olmasa da bazen gerçekten önem arz edebiliyor. Bir sonraki makalede görüşmek üzere…

Bu yazı : http://www.kemalkefeli.com.tr/sql-serverda-tum-tablolari-silmek.html adresinden alınmıştır.

Müellifi: Hüsrev YILDIZ
Yayın Tarihi : 30.11.2017

Hüsrev YILDIZ