2011-04-13 18 views
18

पर प्राथमिक कुंजी कैसे बदल सकता हूं मैं SQL Azure पर प्राथमिक कुंजी बदलने जा रहा हूं। लेकिन यह स्क्रिप्ट उत्पन्न करने के लिए Microsoft SQL सर्वर प्रबंधन स्टूडियो का उपयोग करते समय एक त्रुटि फेंकता है। चूंकि SQL Azure पर प्रत्येक तालिका में प्राथमिक कुंजी होनी चाहिए। और मैं इसे बनाने से पहले इसे छोड़ नहीं सकता। अगर मुझे इसे बदलना है तो मैं क्या कर सकता हूं?मैं SQL Azure

स्क्रिप्ट

IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[mytable]') AND name = N'PK_mytable') 
ALTER TABLE [dbo].[mytable] DROP CONSTRAINT [PK_mytable] 
GO 

ALTER TABLE [dbo].[mytable] ADD CONSTRAINT [PK_mytable] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) 
GO 

उत्पन्न त्रुटि संदेश

Msg 40054, Level 16, State 2, Line 3 
Tables without a clustered index are not supported in this version of SQL Server. Please create a clustered index and try again. 
Msg 3727, Level 16, State 0, Line 3 
Could not drop constraint. See previous errors. 
The statement has been terminated. 
Msg 1779, Level 16, State 0, Line 3 
Table 't_event_admin' already has a primary key defined on it. 
Msg 1750, Level 16, State 0, Line 3 
Could not create constraint. See previous errors. 

उत्तर

22

मैं इस सटीक समस्या में पड़ गए और मंचों पर Azure टीम से संपर्क किया। असल में यह संभव नहीं है। आपको एक नई टेबल बनाने और डेटा को स्थानांतरित करने की आवश्यकता होगी।

  • OLD_MyTable करने के लिए पुराने तालिका का नाम बदला:

    क्या मैंने किया था एक सौदे और बनाने यह भीतर निम्न कार्य था।

  • सही प्राथमिक कुंजी के साथ नई तालिका बनाएं और इसे MyTable पर कॉल करें।

  • OLT_MyTable से MyTable में सामग्री का चयन करें।

  • ड्रॉप OLD_MyTable।

आपको किसी भी बाधा पर sp_rename को कॉल करने की भी आवश्यकता हो सकती है ताकि वे संघर्ष न करें।

यह भी देखें: http://social.msdn.microsoft.com/Forums/en/ssdsgetstarted/thread/5cc4b302-fa42-4c62-956a-bbf79dbbd040

3

आप निम्न स्क्रिप्ट की कोशिश कर सकते हैं। इसे अपने टेबल डीफ़ के अनुरूप बनाने के लिए बदलें।

EXECUTE sp_rename N'[PK_MyTable]', N'[PK_MyTable_old]', 'OBJECT' 

CREATE TABLE [dbo].[Temp_MyTable](
[id] [int] NOT NULL, 
[text] [text] NOT NULL CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED (
[id] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)) 

INSERT INTO dbo.[Temp_MyTable] (Id, Text) 
SELECT Id, Text FROM dbo.MyTable 

drop table dbo.MyTable 
EXECUTE sp_rename N'Temp_MyTable', N'MyTable', 'OBJECT' 
4

मुझे सराहना है कि यह आपके लिए दिन में देर हो सकती है, लेकिन यह दूसरों की मदद कर सकती है।

मैं हाल ही में इस मुद्दे पर आया और पाया कि कम से कम दर्दनाक समाधान Azure से डेटाबेस डाउनलोड करना था, इसे स्थानीय रूप से पुनर्स्थापित करना, स्थानीय कुंजी को स्थानीय रूप से अपडेट करना (क्योंकि मुख्य बाधा एक SQL Azure विशिष्ट समस्या है), और फिर उसे पुनर्स्थापित करें Azure में डेटाबेस वापस।

इसने डेटाबेस का नाम बदलने या उनके बीच डेटा स्थानांतरित करने के संबंध में किसी भी मुद्दे को बचाया।

+0

क्या एक अद्भुत सरल जवाब है। निर्यात और मनोरंजन को कार्यान्वित करना एक मस्तिष्क मोड़ था, क्योंकि यह सब के साथ मेरा पहला समय था, लेकिन अंत में, यह बहुत ही सुरुचिपूर्ण था। – krillgar

6

एसक्यूएल वी 12 को अपग्रेड करें और ढेर पर इसका समर्थन किया जाता है। तो आप प्राथमिक कुंजी छोड़ सकते हैं और इसे फिर से बना सकते हैं।

+1

प्रश्न के लिए पूरी तरह से अप्रासंगिक। – Casey

+1

यह वास्तव में एक अच्छा जवाब है। मैंने अपना पुराना पीके गिरा दिया और फिर लगभग एक मिनट में एक नई प्राथमिक कुंजी बनाई। अतीत में, मुझे टेबल चाल का नामकरण और आयात करना था। यह समय लेने वाला था। वी 12 में फुलटेक्स्ट इंडेक्सिंग के लिए समर्थन सहित कई और अधिक SQL सर्वर सुविधाएं हैं। –

+0

यह सवाल Azure के बारे में है। एक स्टैंडअलोन डेटाबेस नहीं है। –

0

यह प्रश्न पुराना है क्योंकि पीके बदलना पहले से ही SQL Azure के नवीनतम संस्करण में समर्थित है। और आपको अस्थायी तालिका बनाने की ज़रूरत नहीं है।