2012-08-03 25 views
189

प्रस्तावना"रोकें परिवर्तन है कि मेज की आवश्यकता होती है बचत कर फिर से बनाया करने के लिए" नकारात्मक प्रभाव

मैं 2008 आज एसक्यूएल सर्वर में एक स्तंभ को संशोधित किया गया था, मुद्रा (18,0) की तरह कुछ से डेटाप्रकार बदलने के (19,2)।

मुझे त्रुटि मिली "आपके द्वारा किए गए परिवर्तनों को SQL सर्वर से निम्न तालिकाओं को छोड़ने और फिर से बनाए जाने की आवश्यकता है"।

इससे पहले कि आप जवाब देने के लिए हाथापाई, कृपया इसे पढ़ें निम्नलिखित:

मैं पहले से ही पता है कि ► विकल्प ► डिजाइनर ► टेबल और डाटाबेस डिजाइनर ► स्थित बॉक्स को अचयनित "रोकें बचत उपकरण में विकल्प है परिवर्तन जो तालिका पुन: निर्माण की आवश्यकता है। " Prevent saving changes that require table re-creation in five clicks ... तो उस के साथ जवाब न दें!

वास्तविक प्रश्न

मेरे वास्तविक प्रश्न इस प्रकार है, कुछ और के लिए है:

वहाँ किसी भी नकारात्मक प्रभाव/ऐसा करने का संभव कमियां हैं?

क्या तालिका वास्तव में गिरा दी जाती है और जब यह बॉक्स अनचेक किया जाता है तो स्वचालित रूप से फिर से बनाया जाता है?

यदि हां, तो क्या तालिका स्रोत तालिका की 100% सटीक प्रतिकृति प्रतिलिपि है?

+56

उपकरण> विकल्प> डिजाइनर ... यही वह था खोज रहे हैं! धन्यवाद! – nrod

+1

भी http://stackoverflow.com/questions/9870968/cant-change-table-design-in-sql-server-2008/9870989#9870989 – pylover

+1

पर एक नज़र डालें और आप एमएस SQL ​​सर्वर 2014 के साथ कर रहे हैं -> अतिरिक्त > विकल्प> शीर्ष मेनू से डिजाइनर। – Vityata

उत्तर

76

तालिका केवल उन मामलों में गिरा दी गई है और फिर से बनाई गई हैं जहां SQL सर्वर के प्रबंधन स्टूडियो को यह जानने के लिए प्रोग्राम किया गया है कि यह कैसे किया जाए।

निश्चित रूप से ऐसे मामले हैं जहां ऐसा करने की आवश्यकता नहीं होती है, लेकिन ऐसे मामले भी होंगे जहां प्रबंधन स्टूडियो में आपके द्वारा किए गए संपादन ड्रॉप और फिर से बनाए जाएंगे क्योंकि इसे नहीं करना है ।

समस्या यह है कि सभी मामलों की गणना करना और यह निर्धारित करना कि लाइन के किनारे किनारे पर वे गिरेंगे, काफी कठिन होंगे।

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

+2

वास्तव में एक अच्छा जवाब है, मुझे लगता है कि यह ओपी द्वारा उठाए गए सभी सवालों के जवाब प्रदान नहीं करता है, और उन प्रश्नों में वे हैं जिनकी मुझे रूचि है। विशेष रूप से _ क्या ऐसा करने के लिए कोई नकारात्मक प्रभाव/संभावित दोष हैं? _ और _ यदि ऐसा है, तो क्या तालिका स्रोत तालिका की 100% सटीक प्रतिकृति प्रतिलिपि है? _। क्या आपके पास उन प्रश्नों के बारे में कोई जानकारी है? – tfrascaroli

11

Reference - इस विकल्प को बंद करने से आप एक टेबल को फिर से बनाने से बचने में मदद कर सकते हैं, इससे परिवर्तन में कमी आ सकती है। उदाहरण के लिए, मान लीजिए कि आप तालिका में परिवर्तनों को ट्रैक करने के लिए SQL Server 2008 में चेंज ट्रैकिंग सुविधा सक्षम करते हैं। जब आप एक ऐसा ऑपरेशन करते हैं जो तालिका को फिर से बनाया जा सकता है, तो आपको "लक्षण" खंड में उल्लिखित त्रुटि संदेश प्राप्त होता है। हालांकि, अगर आप इस विकल्प को बंद करते हैं, तो तालिका फिर से बनाई जाने पर मौजूदा परिवर्तन ट्रैकिंग जानकारी हटा दी जाती है। इसलिए, माइक्रोसॉफ्ट अनुशंसा करता है कि आप विकल्प को बंद करके इस समस्या के आसपास काम न करें।

11

एसक्यूएल सर्वर बूंदों और तालिकाओं का पुनर्निर्माण करने वाला केवल यदि आप:

  • एक नया स्तंभ
  • बदलें जोड़े एक स्तंभ
  • बदलें तालिका
  • बदलें में स्तंभ क्रम के लिए Nulls सेटिंग की अनुमति दें कॉलम डेटा प्रकार

ALTER का उपयोग करना सुरक्षित है, जैसे कि तालिका को फिर से बनाते समय मेटाडेटा खो जाता है, आपका डेटा खो जाएगा।

+8

आपकी सूची पूरी नहीं है। उदाहरण के लिए, कॉलम पर 'पहचान' गुण जोड़ें/हटाएं। –

+1

नलिकाओं वाले फ़ील्ड के अंत में एक नया कॉलम जोड़ना तालिका पुनर्निर्माण की आवश्यकता नहीं है। – PseudoToad

233

टूल्स -> विकल्प -> डिजाइनर नोड -> अनचेक करें " टेबल मनोरंजन की आवश्यकता वाले परिवर्तनों को सहेजने से रोकें"।

+23

यह दिलचस्प है कि कैसे एक जवाब है कि यह से सवाल लेकिन प्रतियां जानकारी का उत्तर न मिले हो जाता है बहुत upvotes – Breeze

+0

नहीं है, ऐसा लगता है कि जैसे आप बहुत से लोगों को मदद की है, तो आप इसके लायक हैं। मैं आश्चर्यचकित हूं – Breeze

+1

@ ब्रीज़ मैं भी हैरान हूं। इस सवाल पर लगभग उतना ही टिप्पणी जो वास्तव में एक ही चीज़ के लिए धन्यवाद कहती है। ओपी नहीं था, भले ही लोग उस सुविधा की खोज कर रहे हों। – philthyfool

1

हाँ, वहाँ इस से नकारात्मक प्रभाव हैं:

यदि आप बाहर स्क्रिप्ट एक परिवर्तन इस ध्वज आप नीचे स्क्रिप्ट की तरह कुछ (सभी मैं एक autonumbered पहचान स्तंभ में संपर्क के आईडी कॉलम बदल रहा प्राप्त द्वारा अवरुद्ध , लेकिन तालिका निर्भरता है)। नोट संभावित त्रुटियों कि जब निम्नलिखित चल रहा है हो सकता है:

  1. यहां तक ​​कि माइक्रोसॉफ्ट ने चेतावनी दी है कि इस डेटा हानि (उस टिप्पणी स्वत: जनरेट किया जाता है) का कारण हो सकता!
  2. समय की अवधि के लिए, विदेशी कुंजी लागू नहीं कर रहे हैं।
  3. यदि आप मैन्युअल SSMS और में इस रन 'EXEC (' में सम्मिलित 'विफल रहता है, और आप निम्न कथनों चलाने (जो वे डिफ़ॉल्ट रूप से करते हैं, के रूप में वे के आधार पर विभाजित कर रहे हैं' जाना ') तो आप 0 पंक्तियां सम्मिलित होगा , फिर पुराने तालिका ड्रॉप
  4. अगर यह एक बड़ा टेबल है, सम्मिलित का क्रम बड़ा हो सकता है, और लेन-देन एक स्कीमा संशोधन ताला तो ब्लॉक कई बातें कर रहा है,

।। - -

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/ 

BEGIN TRANSACTION 
GO 
ALTER TABLE raw.Contact 
    DROP CONSTRAINT fk_Contact_AddressType 
GO 
ALTER TABLE ref.ContactpointType SET (LOCK_ESCALATION = TABLE) 
GO 
COMMIT 
BEGIN TRANSACTION 
GO 
ALTER TABLE raw.Contact 
    DROP CONSTRAINT fk_contact_profile 
GO 
ALTER TABLE raw.Profile SET (LOCK_ESCALATION = TABLE) 
GO 
COMMIT 
BEGIN TRANSACTION 
GO 
CREATE TABLE raw.Tmp_Contact 
    (
    ContactID int NOT NULL IDENTITY (1, 1), 
    ProfileID int NOT NULL, 
    AddressType char(2) NOT NULL, 
    ContactText varchar(250) NULL 
    ) ON [PRIMARY] 
GO 
ALTER TABLE raw.Tmp_Contact SET (LOCK_ESCALATION = TABLE) 
GO 
SET IDENTITY_INSERT raw.Tmp_Contact ON 
GO 
IF EXISTS(SELECT * FROM raw.Contact) 
    EXEC('INSERT INTO raw.Tmp_Contact (ContactID, ProfileID, AddressType, ContactText) 
     SELECT ContactID, ProfileID, AddressType, ContactText FROM raw.Contact WITH (HOLDLOCK TABLOCKX)') 
GO 
SET IDENTITY_INSERT raw.Tmp_Contact OFF 
GO 
ALTER TABLE raw.PostalAddress 
    DROP CONSTRAINT fk_AddressProfile 
GO 
ALTER TABLE raw.MarketingFlag 
    DROP CONSTRAINT fk_marketingflag_contact 
GO 
ALTER TABLE raw.Phones 
    DROP CONSTRAINT fk_phones_contact 
GO 
DROP TABLE raw.Contact 
GO 
EXECUTE sp_rename N'raw.Tmp_Contact', N'Contact', 'OBJECT' 
GO 
ALTER TABLE raw.Contact ADD CONSTRAINT 
    Idx_Contact_1 PRIMARY KEY CLUSTERED 
    (
    ProfileID, 
    ContactID 
    ) 

GO 
ALTER TABLE raw.Contact ADD CONSTRAINT 
    Idx_Contact UNIQUE NONCLUSTERED 
    (
    ProfileID, 
    ContactID 
    ) 

GO 
CREATE NONCLUSTERED INDEX idx_Contact_0 ON raw.Contact 
    (
    AddressType 
    ) 
GO 
ALTER TABLE raw.Contact ADD CONSTRAINT 
    fk_contact_profile FOREIGN KEY 
    (
    ProfileID 
    ) REFERENCES raw.Profile 
    (
    ProfileID 
    ) ON UPDATE NO ACTION 
    ON DELETE NO ACTION 

GO 
ALTER TABLE raw.Contact ADD CONSTRAINT 
    fk_Contact_AddressType FOREIGN KEY 
    (
    AddressType 
    ) REFERENCES ref.ContactpointType 
    (
    ContactPointTypeCode 
    ) ON UPDATE NO ACTION 
    ON DELETE NO ACTION 

GO 
COMMIT 
BEGIN TRANSACTION 
GO 
ALTER TABLE raw.Phones ADD CONSTRAINT 
    fk_phones_contact FOREIGN KEY 
    (
    ProfileID, 
    PhoneID 
    ) REFERENCES raw.Contact 
    (
    ProfileID, 
    ContactID 
    ) ON UPDATE NO ACTION 
    ON DELETE NO ACTION 

GO 
ALTER TABLE raw.Phones SET (LOCK_ESCALATION = TABLE) 
GO 
COMMIT 
BEGIN TRANSACTION 
GO 
ALTER TABLE raw.MarketingFlag ADD CONSTRAINT 
    fk_marketingflag_contact FOREIGN KEY 
    (
    ProfileID, 
    ContactID 
    ) REFERENCES raw.Contact 
    (
    ProfileID, 
    ContactID 
    ) ON UPDATE NO ACTION 
    ON DELETE NO ACTION 

GO 
ALTER TABLE raw.MarketingFlag SET (LOCK_ESCALATION = TABLE) 
GO 
COMMIT 
BEGIN TRANSACTION 
GO 
ALTER TABLE raw.PostalAddress ADD CONSTRAINT 
    fk_AddressProfile FOREIGN KEY 
    (
    ProfileID, 
    AddressID 
    ) REFERENCES raw.Contact 
    (
    ProfileID, 
    ContactID 
    ) ON UPDATE NO ACTION 
    ON DELETE NO ACTION 

GO 
ALTER TABLE raw.PostalAddress SET (LOCK_ESCALATION = TABLE) 
GO 
COMMIT