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:

SQL
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:

SQL
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:

SQL
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:

SQL
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:

SQL
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…

Benzer Makaleler

5 thoughts on “SQL Server’da Tüm Tabloları Silmek

  1. tüm tabloları değil de adında “blabla” geçen tabloları silmek istiyorsak napıcaz?
    veya adı “blabla” ya benzeyen tabloları silmek için?

    cevaplarsanız çok sevinirim.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

warning
www.kemalkefeli.com.tr üzerindeki herhangi bir yazının veya kodun izinsiz olarak başka bir yerde kullanılması yasaktır.