2009-01-21 26 views
34

SQL Server Management Studio'da yıkıcı sorgular (ör., DELETE veya UPDATE) yazarken her zaman kendimi çalıştırmadan sorgunun sonuçlarını önizleme yapabilmeyi diliyorum. Access çok kolay bir şekilde bunu yapmanıza izin verir, ancak elime SQL'i kodlamayı tercih ederim, ne yazık ki Access çok zayıf.Yıkıcı SQL sorgusunu nasıl önizlerim?

Benim soru iki yönlüdür:

  1. SSMS için bir eklenti veya ayrıca bir yıkıcı sorgunun sonucunu önizleme yapabilirsiniz iyi bir SQL elle kodlama imkanı ile donatılmıştır ayrı araç var mı , Access'e benzer? "El ile" önizlemeleri yapmak için herhangi bir teknik veya en iyi uygulama var mıdır; ör. bir şekilde işlemleri kullanıyor?

O bu tür bir şey yapıyor temelde önemli olduğunu bana öyle geliyor ama henüz ben (muhtemelen sadece yanlış bir şey arıyorum Google üzerinden bir şey bulmak gibi olamaz - Bunu korkunç cahil değilim madde). Şu anda ben oldukça kıllı bir kemer ve hatlarını seçme/silme/güncelleme hatlarını yorumlama ve yedekleme yapma ve yedekleme yaptığımdan emin olma kılığına giriyorum. Elbette daha iyi bir yol olmalı.

Herkes yardımcı olabilir mi?

+0

http://stackoverflow.com/questions/281339/confirm-before-delete-update-in-sql-management -studio – Rockcoder

cevap

51

Ben itibaren SQL SERVER 2008 mevcut ÇIKIŞ maddesini kullanmak istiyorsunuz

OUTPUT Clause (Transact-SQL)

şey gibi ...

BEGIN TRANSACTION 

DELETE [table] OUTPUT deleted.* WHERE [woof] 

ROLLBACK TRANSACTION 

ekler ve güncelleştirmeler de 'eklenen' tabloyu kullanabilirsiniz. MSDN makalesi hepsini kapsar.

DÜZENLEME: SELECT diğer öneriler daha sonra aslında ikisi birlikte yapar dışında bir hareket içinde DELETE gibi

budur. Yani bir işlemi açarsınız, bir OUTPUT yan tümcesiyle/insert/update silinir ve yapılan değişikliklerin aynısını verirken değişiklikler yapılır. Sonra geri almayı veya işlemeyi seçebilirsiniz. Hep aşağıdaki gibi bir şey yapmak benim Ekibi sormak böylece

+0

Superb, tam da peşindeyim. Teşekkür ederim. :) –

+0

Rica ederim :) – MatBailie

+0

Kevin'ın çözümünü tercih ediyorum çünkü sonuçları değiştirmeden sonuçları görebilirsiniz. 100000 kayıtlarını seç, 100000 kayıtlarını silmek, silinen sonuçları geri almak ve daha sonra geri almaktan ziyade, veritabanı performansı için daha iyi bir gruptur. – HLGEM

2

İşlemin kapsamında olduğunuzda, işlem gerçekleşmeden önce değişiklikleri geri alabilirsiniz. (Ya açıkça tran işlemek veya bir koşul ortaya çıkarsa o örtük hareketi tamamlamak için sunucuyu neden olacaktır arayarak) ...

create table x (id int, val varchar(10)) 

insert into x values (1,'xxx') 
begin tran 

delete from x 
select * from x 

rollback tran 
select * from x 
22

benim veritabanlarına bunu birisi korkusu yaşıyor: Bu şekilde

BEGIN TRAN 
  
DELETE FROM X 
-- SELECT * FROM X 
FROM Table A as X JOIN Table B ON Blah blah blah 
WHERE blah blah blah 
  
ROLLBACK TRAN 
COMMIT TRAN 

, yanlışlıkla F5 vurmak if (done it!) Sen hiçbir değişiklik yapmayacağım. Hangi kayıtların değiştirileceğini (ve kaç tane) görmek için SQL deyiminin sonuna SELECT bölümünü vurgulayabilirsiniz. Ardından, BEGIN TRAN'ı ve tüm Delete ifadesini vurgulayın ve çalıştırın. Beklediğiniz aynı sayıda kaydı silerseniz, COMMIT TRAN'ı vurgulayın ve çalıştırın. Herhangi bir şey kazara görünüyorsa, ROLLBACK TRAN'ı vurgulayın ve çalıştırın.

Bunu UPDATE veya DELETE deyimiyle yapıyorum. Beni birkaç kez kurtardı, ama her zaman huzur veriyor.

+0

NEDENİYLE DELETE ve SELECT'i ek güvenlik için başka bir yere koyardım. –

+2

Listelenen sırayla yapmamın nedeni, BEGIN TRAN ve DELETE deyimini birlikte vurgulayabilmem. DELETE yorumlandıysa, bunları ayrı ayrı yapmak zorundayım, ama bu sadece geliştirici tercihi. Yorum için teşekkürler. –

+3

Bu, bir kişi COMMIT'i unutuncaya kadar tamam çalışıyor ve diğer kullanıcıları engelliyorsunuz. Bunun çok fazla olduğunu gördüm, bu yüzden bu stratejiyi kullanırken dikkatli olun. –

1

Nelerin silineceğini görmek istediğimde, "sil" ifadesini "select *" olarak değiştiriyorum. Bunu bir işlemi kullanmaktan daha çok seviyorum çünkü kilitleme konusunda endişelenmem gerekmiyor.

+1

Her zaman işleri herhangi bir şekilde işlemeye çalışıyorum. Her ihtimale karşı. Nerede fıkra, f5 isabet ve boş kahve bardağa boş bir şekilde bakan dışında her şeyi vurgulamak gibi ... – MatBailie

4

silerken:

BEGIN TRANSACTION 

    DELETE FROM table1 
    OUTPUT deleted.* 
    WHERE property1 = 99 

ROLLBACK TRANSACTION 

takmadan/güncellerken:

BEGIN TRANSACTION 

    UPDATE table1 
    SET table1.property1 = 99 
    OUTPUT inserted.* 

ROLLBACK TRANSACTION 
İlgili konular