2009-01-21 13 views
34

SQL सर्वर प्रबंधन स्टूडियो में विनाशकारी प्रश्नों (उदा।, हटाएं या अद्यतन) लिखते समय मैं हमेशा अपनी इच्छा करता हूं कि मैं वास्तव में इसे चलाने के बिना क्वेरी के परिणामों का पूर्वावलोकन कर सकता हूं। एक्सेस आसानी से आपको ऐसा करने की अनुमति देता है, लेकिन मैं अपने एसक्यूएल को हाथ से कोड करना पसंद करता हूं, दुख की बात है, एक्सेस बहुत खराब है।मैं एक विनाशकारी एसक्यूएल क्वेरी का पूर्वावलोकन कैसे करूं?

तो मेरे सवाल दोहरा है:

  1. वहाँ SSMS के लिए एक ऐड-ऑन, या एक अलग उपकरण है जो अच्छा एसक्यूएल हाथ-कोडिंग की सुविधा भी एक विनाशकारी क्वेरी का परिणाम पूर्वावलोकन कर सकते हैं कि के साथ सुसज्जित है है , एक्सेस के समान?

  2. क्या "हाथ से" पूर्वावलोकन करने के लिए कोई तकनीक या सर्वोत्तम प्रथाएं हैं; उदाहरण के लिए, लेनदेन का उपयोग कर किसी भी तरह?

मुझे ऐसा लगता है कि बात यह है कि इस तरह की कर मूल रूप से महत्वपूर्ण है, लेकिन फिर भी मैं (मैं शायद सिर्फ गलत बात के लिए देख रहा हूँ गूगल के जरिये कुछ भी नहीं कर पा रहे - मैं इस पर बहुत अज्ञानी हूं मामला)। वर्तमान में मैं चुनिंदा/हटा/अपडेट लाइनों में टिप्पणी करने और बैकअप करने के लिए सुनिश्चित करने के लिए एक बालों वाली बेल्ट और ब्रेसिज़ दृष्टिकोण ले रहा हूं। निश्चित रूप से एक बेहतर तरीका होना चाहिए?

क्या कोई मदद कर सकता है?

+0

http://stackoverflow.com/questions/281339/confirm-before-delete-update-in-sql-management -स्टूडियो – Rockcoder

उत्तर

51

मैं एसक्यूएल सर्वर 2008 के बाद में आउटपुट खंड वर्तमान का प्रयोग करेंगे ...

OUTPUT Clause (Transact-SQL)

कुछ की तरह ...

BEGIN TRANSACTION 

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

ROLLBACK TRANSACTION 

सम्मिलित करता है और अद्यतन के भी 'डाला' तालिका का उपयोग कर सकते हैं। एमएसडीएन लेख में यह सब शामिल है।

संपादित करें:

यह वह जगह है जैसे चयन के अन्य सुझाव तो एक सौदे के अंदर हटा, सिवाय इसके कि यह वास्तव में दोनों एक साथ करता है। तो आप एक ओयूटीटीयूटी क्लॉज के साथ एक लेनदेन खोलें, हटाएं/डालें/अपडेट करें, और जो भी किया गया था उसे आउटपुट करते समय परिवर्तन किए जाते हैं। फिर आप रोलबैक या प्रतिबद्ध करना चुन सकते हैं।

+0

शानदार, यह वही है जो मैं बाद में रहा हूं। धन्यवाद। :) –

+0

आपका स्वागत है :) – MatBailie

+0

मैं केविन के समाधान को प्राथमिकता देता हूं क्योंकि आप डेटा को बदले बिना परिणाम देख सकते हैं। 100000 रिकॉर्ड्स का चयन करें 100000 रिकॉर्ड्स को हटाने, हटाए गए परिणामों को आउटपुट करने और फिर रोलबैक के बजाय डेटाबेस प्रदर्शन के लिए एक संपूर्ण समूह बेहतर है। – HLGEM

2

जब आप लेनदेन के संदर्भ में होते हैं, तो लेनदेन से पहले किसी भी समय रोलबैक परिवर्तन कर सकते हैं। (या तो स्पष्ट रूप ट्रॅन प्रतिबद्ध या यदि एक शर्त उठता है कि सर्वर का कारण परोक्ष लेनदेन प्रतिबद्ध करने के लिए होगा फोन करके)

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

मैं किसी को अपने डेटाबेस के लिए ऐसा करने का भय में रहते हैं तो मैं हमेशा निम्नलिखित की तरह कुछ करने के लिए मेरी टीम से पूछते हैं:

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 

इस तरह, अगर आप गलती से F5 मारा (यह किया!) आप कोई बदलाव नहीं करेगा। आप SQL कथन के अंत के माध्यम से SELECT भाग को हाइलाइट कर सकते हैं यह देखने के लिए कि कौन से रिकॉर्ड बदले जाएंगे (और कितने)। फिर, BEGIN TRAN और संपूर्ण हटाएं कथन को हाइलाइट करें और इसे चलाएं। यदि आप अपेक्षित रिकॉर्ड्स की उसी संख्या को हटाते हैं, तो COMMIT TRAN को हाइलाइट करें और इसे चलाएं। अगर कुछ भी भद्दा दिखता है, तो रोलबैक ट्रैन को हाइलाइट करें और इसे चलाएं।

मैं इसे किसी भी अद्यतन या हटाए गए कथन के साथ करता हूं। यह मुझे दो बार बचाया है, लेकिन यह हमेशा दिमाग की शांति प्रदान करता है।

+0

मैं हटाया गया और अतिरिक्त सुरक्षा के लिए दूसरी तरफ चयन करें। –

+2

सूचीबद्ध क्रम में मैं इसे करने का कारण यह है कि मैं BEGIN TRAN और DELETE कथन को एक साथ हाइलाइट कर सकता हूं। अगर डिलीट पर टिप्पणी की गई थी, तो मुझे उन्हें अलग से करना होगा, लेकिन यह केवल डेवलपर वरीयता है। टिप्पणी के लिए धन्यवाद। –

+3

यह सब ठीक काम करता है जब तक कोई COMMIT को भूल नहीं जाता - और आप अन्य उपयोगकर्ताओं को अवरुद्ध कर देते हैं। मैंने देखा है कि यह कई बार होता है, इसलिए इस रणनीति का उपयोग करते समय सावधान रहें। –

1

जब मैं देखना चाहता हूं कि क्या हटाया जाएगा, तो मैं बस "हटाएं" कथन को "चयन *" में बदलता हूं। मुझे लेनदेन का उपयोग करने से बेहतर लगता है क्योंकि मुझे लॉकिंग के बारे में चिंता करने की ज़रूरत नहीं है।

+1

मैं हमेशा चीजों को किसी भी तरह लेनदेन में रखने की कोशिश करता हूं। शायद ज़रुरत पड़े। जहां खंड, सिवाय इसके अलावा सबकुछ हाइलाइट करना, F5 को मारना और फिर खाली कॉफी मग पर खाली रूप से घूरना ... – MatBailie

4

जब को हटाने:

BEGIN TRANSACTION 

    DELETE FROM table1 
    OUTPUT deleted.* 
    WHERE property1 = 99 

ROLLBACK TRANSACTION 

जब/अद्यतन करने डालने:

BEGIN TRANSACTION 

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

ROLLBACK TRANSACTION 
संबंधित मुद्दे