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…
teşekkürler
Müthiş
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.
Merhaba,
Aşağıdaki linkte istediğiniz cevap mevcut. Örnekteki 5. satırda where koşuluna istediğiniz kısıtlamayı yazabilirsiniz.
https://stackoverflow.com/a/4401/920472
Eyvallah..