2009-05-17 7 views
10

ऐसा लगता है कि यह मेरे लिए कोई ब्रेनर नहीं है। मैंने अद्यतनों में WHERE क्लॉज को भूलने या हटाने और पूरी तालिका को कचरा करने वाले लोगों के बारे में अनगिनत कहानियां सुनाई हैं। मुझे पता है कि लापरवाही लोगों को सीधे प्रश्नों को जारी नहीं करना चाहिए और यह सब ... और वैध कानून हैं जहां आप सभी पंक्तियों को प्रभावित करना चाहते हैं, लेकिन क्या यह डिफ़ॉल्ट रूप से एक विकल्प रखने का अर्थ नहीं होगा जिसके लिए ऐसे प्रश्नों की आवश्यकता हैSQL सर्वर ने डिफ़ॉल्ट रूप से WHERE क्लॉज अनिवार्य क्यों नहीं बनाया है?

UPDATE MyTable SET MyColumn = 0 WHERE 1 = 1 -- tacky, I know 
+4

आप मान रहे हैं कि मस्तिष्क-मृत केवल एक WHERE 1 = 1 को जोड़कर नहीं जोड़ेंगे और इसके बजाय सोचने लगेगा। मुझे नहीं लगता कि ऐसा होगा: वे सभी के बाद मस्तिष्क-मृत हैं। इस बीच, प्रत्येक कॉर्पोरेट को "जोश" विकल्प को "सुरक्षा" के लिए हर समय सेट करने की आवश्यकता होगी और सोचने वाली दुनिया आपको शिकार करेगी और आपको मार डालेगी। आईएमएचओ, ज़ाहिर है, वाईएमएमवी। –

+1

तो आप मुझे यह बताने का मतलब है कि जानबूझकर अपडेट जारी करना और हटाना आम है कि जहां कोई खंड नहीं है और "सोचने वाली दुनिया" इस विकल्प से इतनी परेशान होगी कि वे मुझे मरना चाहते हैं? – Josh

+5

मैं इस तर्क को नहीं खरीदता कि लोग 'WHERE 1 = 1' टाइप करना सीखेंगे जहां वे वास्तव में इसे नहीं चाहते हैं। उस आदत को विकसित करने के लिए, उन्हें लगातार परिस्थितियां रखना पड़ता था जहां वे वास्तव में प्रत्येक पंक्ति को मारने के लिए अद्यतन चाहते थे, और यह उस स्थिति में बहुत कम आम लगता है जहां आप * नहीं चाहते हैं। 'WHERE 1 = 1' जैसी चीज़ों की आवश्यकता होने का बिंदु उन लोगों के खिलाफ सुरक्षा नहीं करना है जो * सोचा * वे हर पंक्ति को मारना चाहते थे, यह उन लोगों के खिलाफ सुरक्षा करना है जिन्होंने गलती से F5 को बहुत जल्दी मारा या सबकुछ चुना लेकिन जहां अनुभाग । –

उत्तर

5

क्या आपके क्लाइंट सत्र में गलत रूप से ऑटो प्रतिबद्धता सेट करना संभव नहीं है चूक?आपको अपने परिवर्तनों को इस तरह से देखने के लिए "प्रतिबद्ध" जारी करना होगा, लगभग "क्या आप वाकई यह करना चाहते हैं?" फैशन।

मुझे विश्वास है कि एक पूर्व नियोक्ता में सभी ओरेकल TOAD क्लाइंट के लिए डिफ़ॉल्ट था।

+0

अच्छा! मुझे इसके बारे में पता नहीं था लेकिन इसे एसईटी IMPLICIT_TRANSACTIONS {ON | कहा जाता है OFF} और जैसा कि आपने नोट किया है, यह कमांड को स्पष्ट प्रतिबद्धता की आवश्यकता के कारण बनाता है। जबकि मैं निश्चित रूप से उस विकल्प के साथ निश्चित रूप से चल रहा हूं, फिर भी मुझे यह गलत लगता है कि SQL सभी पंक्तियों को प्रभावित करने के लिए डिफ़ॉल्ट है। – Josh

+0

यदि यह "अच्छा" है, तो वोट क्यों न दें और जवाब स्वीकार करें? आपको SQL मानक निकाय को सतर्क करना होगा ताकि उन्हें यह बताने लगे कि आप उनके निर्णय को स्वीकार नहीं करते हैं। – duffymo

+0

मैंने इसे वोट दिया लेकिन कोई भी साथ आया और सभी सहमत उत्तरों को वोट दिया। मैंने इसे उत्तर के रूप में चिह्नित नहीं किया क्योंकि मैं यह देखने का इंतजार कर रहा था कि कोई व्यक्ति कुछ स्पष्टीकरण के साथ आएगा कि यह क्यों नहीं किया जा सकता है या नहीं किया जाना चाहिए। लेकिन ऐसा लगता है कि "हम प्रोग्रामर हैं इसलिए हमें गलती नहीं करनी चाहिए" जवाब सबसे लोकप्रिय है। मैं तुम्हारा निशान करूंगा। – Josh

10

UPDATE MyTable SET MyColumn = 0 WHERE * 

या भाषा बदले बिना, क्योंकि spec यह आवश्यकता नहीं है, और तुम वैसे भी सीधे तदर्थ एसक्यूएल चलाना नहीं करना चाहिए उत्पादन डेटा के खिलाफ: की तरह लिखा होना चाहिए।

+5

"किसी भी तरह से उत्पादन डेटा के खिलाफ सीधे विज्ञापन एसक्यूएल नहीं चलाना चाहिए"। जबरदस्त हंसी। लोगों को राजमार्ग पर गति सीमा से अधिक नहीं होना चाहिए - लेकिन वे करते हैं, और लोगों को अब चोट को रोकने के लिए सीटबेल पहनने के लिए मजबूर होना पड़ता है। ओपी सोच रहा है कि एसक्यूएल भूमि में सीटबेल की आवश्यकता क्यों नहीं है। – TheSoftwareJedi

+6

सीटबेल को कम से कम एक विकल्प होना चाहिए – rpetrich

+2

जबकि सीटबेल एक विकल्प होना चाहिए, आईएमएचओ, वहां कोई भी होने की आवश्यकता नहीं है। हम प्रोग्रामर हैं, और उन्हें बड़ी शक्ति दी गई है, जो डेटाबेस के उदय और पतन का कारण बनती हैं; हमें अपने दैनिक कार्य में बड़ी ज़िम्मेदारी और देखभाल का उपयोग करना चाहिए। अगर कोई उपलब्ध हो तो व्यवस्थापक सीटबेट सक्षम कर सकता है, लेकिन मुझे नहीं लगता कि हमें उम्मीद करनी चाहिए कि हम वहां रहें। –

4

यह गलती करना प्रोग्रामर के लिए एक लंबे समय से जुड़ा हुआ अनुष्ठान है। हमने सभी इसे बनाया है - और रॉयली ने उत्पादन डेटा खराब कर दिया - इसे ठीक करने की प्रक्रिया में बहुत कुछ सीखना। आप केवल एक बार यह गलती करते हैं, इसलिए जब ऐसा होता है तो डेवलपर रैंक में शामिल होने में मजेदार होता है।

इसे होने से रोकना सभी मजा बर्बाद कर देगा!

:)

+0

सभी गंभीरता में, हाईस्कूल में मेरा पहला काम एक .com के लिए तकनीकी सहायता में काम कर रहा है, वे सचमुच हमें कम से कम तकनीक चलाते हैं जैसे "अद्यतन उपयोगकर्ता सेट लॉकआउट = 0 जहां ..." जबकि एक ऐप हमेशा "विकास में" था । तो जब वे किसी खंड को भूल गए तो वे चिल्लाएंगे। :) लेकिन मैंने हमेशा सोचा है कि वे उस वाक्यविन्यास की अनुमति क्यों देंगे और मुझे अभी भी एक वैध कारण नहीं दिख रहा है। – Josh

4

जोएल, मुझे लगता है कि जोश के सवाल की बात यही वजह है कि कल्पना यह आवश्यकता नहीं है, या पट्टे पर एक विकल्प सेट विशिष्ट डेटाबेस से उसके लिए आवश्यक कर देगा कि है?

चूंकि स्पेक को इसकी आवश्यकता नहीं है, जैसा कि आप कहते हैं, डेटाबेस में पंक्तियों को बदलने के लिए एक गलती क्वेरी (या तो विज्ञापन या बस एक प्रोग्रामिक बग) का अवसर है, जिसे आप बदलने का इरादा नहीं रखते थे।

एक निहित "सभी पंक्तियां" एक अंतर्निहित "नो रोस" की तुलना में अधिक खतरनाक लगती हैं।

+2

मुझे इस बात से सहमत होना होगा कि यह संभवतः सभी के सर्वोत्तम हित में होगा यदि यह कोई अंतर्निहित कोई पंक्ति नहीं थी। –

0

मुझे अनुभव से पता है कि आप केवल एक बार इसे बनाते हैं ... ऐसा होने के बाद आप हमेशा यह सुनिश्चित करते हैं कि इसे फिर कभी न होने दें!

5

बस इसे सुरक्षित हम हमेशा एक सौदे में चला सकते हैं खेलने के लिए:

BEGIN TRAN 

UPDATE MyTable SET MyColumn = 0 

तब पंक्ति संख्या अच्छा लग रहा है, तो:

COMMIT TRAN 
+0

यह एक अच्छा सुझाव है। मैं हमेशा इतना करता हूं कि यह सुनिश्चित करने के अलावा कि मेरे मानदंड अच्छे हैं, किसी अन्य कारण से नहीं। – Josh

4
देखने की मेरी बात से

यह एक rethoric सवाल यह है कि, मेरा मतलब है कि यह एक तरह का सुझाव है ...

डीड में, मुझे लगता है कि यह वास्तव में अच्छा है, "SAFE_UPDATE" जैसी कुछ सेटिंग हो सकती है या ऐसा कुछ ...

क्या मैं आमतौर पर करते हैं, रॉबिन के टिप के अलावा (ALLWAYS एक सौदे को खोलने), इससे पहले चयन के साथ क्वेरी इस

update mytable set column = xx 
-- select * from mytable 
where mycondition = mycondition 

की तरह कुछ चलाने के लिए, बस अभिलेख अद्यतन किया जाएगा पर एक नजर है करने के लिए, है अद्यतन करने मैं सिर्फ वैसे भी चयन से चयन करें और देखें कि यह क्या देता है ...

, आप allways एक बैकअप होना चाहिए (मैंने सुना एसक्यूएल 2005 स्नैपशॉट सुंदर भी शांत कर रहे हैं) और लेन-देन के अंदर काम ...

0

जोश वास्तव में सभी तालिकाओं को हटाने या अपडेट करने के लिए असामान्य नहीं है।

1

MySQL DOES विज्ञापन के लिए यह विकल्प प्रदान करता है। इसे कहा जाता है - सुरक्षित अपडेट (या - i-am-a-dummy)। जैसा कि अन्य ने इंगित किया है, हमने सभी को एक बार गलती की है। हम में से जो लोग हर समय विज्ञापन चलाते हैं, कभी-कभी 1AM पर, गलती को एक से अधिक बार बना दिया है।

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

दो कारण हैं कि यह अधिकांश एमएस पुष्टिकरण संदेशों की तुलना में अधिक उपयोगी है। सबसे पहले यह कुछ ऐसी चीज पकड़ता है जो त्रुटि होने की संभावना है, "क्या आप वाकई उस फ़ाइल को मिटाना चाहते हैं?"। अधिकांश फ़ाइल वास्तव में वांछित हैं, इसलिए पुष्टि एक परेशानी है। अधिकांश " उपयोगकर्ताओं से हटाएं", यदि कोई खंड गुम हो, तो वास्तव में एक त्रुटि है। दूसरा, यह इंगित करता है कि वास्तव में संभावित समस्या क्या है - गुम जहां खंड। यह है जैसे कि फ़ाइल हटाने की पुष्टि पर्याप्त स्मार्ट थी "यह ब्रांड नई अपडेट की गई प्रतिलिपि है, न कि पुरानी प्रतिलिपि जो आपको लगता है कि आप हटा रहे हैं। क्या आप वास्तव में नई प्रति को हटाना चाहते हैं, या आप हटाना चाहते हैं इसके बजाय पुराना? "

वैसे भी, मुझे आम तौर पर "बेवकूफ सबूत" से नफरत है, लेकिन मुझे पसंद है - सुरक्षित अपडेट, और यदि यह विकल्प है जो इसे नहीं चाहते हैं तो इसे उपयोग करने की आवश्यकता नहीं है। मेरी एक चिंता यह है कि यदि आप लगातार उस सिस्टम पर काम करते हैं जिसमें सुविधा है, कोई भी मैला हो सकता है और जब वे बिना किसी सिस्टम पर स्विच करते हैं, जैसे MySQL से MSSQL में स्विच करना।

अंतिम चेतावनी स्क्रैच करें - के बाद ओपन सोर्स से परिचित होने के बाद उनके सही दिमाग में कोई भी एमएस पर स्विच नहीं करेगा। :)

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