2010-09-16 22 views
13

मैंमैं नाम कैसे बदलूं मेरी कमी

EXEC sp_rename 'tblOldAndBusted', 'tblNewAndShiny' 

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

क्या यह स्क्रिप्ट करने का कोई आसान तरीका है?

इसके अलावा, क्या मैं भी गुदा हूं? मुझे पता है कि डेटाबेस बाधाओं में पुराने टेबल नाम के साथ ठीक काम करता है, लेकिन यह broken windows जैसा लगता है।

+5

यह गुदा नहीं है, जब आपको बाधा त्रुटि मिलती है, तो बाध्यता नाम के हिस्से के रूप में वास्तविक तालिका का नाम और कॉलम होना अच्छा होता है, ताकि आप समस्या का पता लगा सकें। यदि बाधा नाम में गलत तालिका का नाम है, तो इससे आपको समस्या का पता लगाने में कुछ देरी होगी। –

+2

यह गुदा नहीं है, यह दंड है। –

उत्तर

20

प्रयास करें:

exec sp_rename 'FK_tblOldAndBusted_tblTastyData', 'FK_tblNewAndShiny_tblTastyData', 'object' 

इसके अलावा, वहाँ इस तरह की चीजों का नाम बदलने के लिए जब आप गैर-डिफ़ॉल्ट schema से निपटने के बारे में एक बग है।

Cannot rename a default constraint for a table in a schema which is not dbo by rsocol @Microsoft Connect

+0

एफवाईआई, बग दिए गए लिंक में बंद स्थिति में है। – ManirajSS

+1

उन लोगों के साथ 'sp_rename' का उपयोग करने वाले लोगों के लिए जिनके नाम में एक बिंदु है (एला एंटिटीफ्रेमवर्क-निर्मित बाधाएं), आपको' ओबजेनाम 'पैरामीटर को ब्रैकेट-अप करने के साथ-साथ' ओब्जेक्ट '' को ' @ objtype' पैरामीटर: 'कार्यकारी sp_rename @objname = '[dbo] [FK_dbo.TableA_dbo.TableB_ColumnOne]।', @newname = 'FK_dbo.TableA_dbo.TableC_ColumnOne', @objtype = 'वस्तु';' – dperish

0

नाम बदलने के लिए भी कई हैं, तो कैसे डंप करने के लिए, तालिका नाम को बदलने के लिए पसंद के किसी भी पाठ संपादक में डंप संपादित करना और फिर डंप से बहाल निर्यात के बारे में? मेरा मतलब है कि केवल बाधाओं का डंप निर्यात करें, सभी नहीं।

+0

दिलचस्प विचार , लेकिन मेरी स्थिति में मुझे एक स्क्रिप्ट बनाना है जिसका उपयोग डेटाबेस की अन्य प्रतियों पर समान परिवर्तन करने के लिए किया जा सकता है। संयोग से, इसकी 10 टेबल से कम, इसलिए एक बड़ा सौदा नहीं है। –

+0

ठीक है। मुझे इस तरह की विधि का उपयोग करना पड़ा जब मेरे MySQL डीबी में से एक विंडोज से अमेज़ॅन आरडीएस में माइग्रेट किया गया था। हमारे पास ऊपरी मामले में सभी टेबल नाम हैं, जबकि विंडोज़ से प्राप्त डीयूएमपी में सभी कम मामले थे। और आरडीएस पर, और लिनक्स के तहत, MySQL तालिका नाम केस संवेदनशील हैं। –

2

यदि कोई दिलचस्पी लेता है, तो मुझे बस एक विशिष्ट पैटर्न में "EnteredDate" नामक ऑडिट फ़ील्ड के लिए सभी डिफ़ॉल्ट बाधाओं का नाम बदलना पड़ा। आवश्यकतानुसार अपडेट करें और बदलें। मुझे उम्मीद है कि यह मदद करता है और एक शुरुआती बिंदु हो सकता है।

DECLARE @TableName VARCHAR(255), @ConstraintName VARCHAR(255) 
DECLARE constraint_cursor CURSOR 
    FOR 
     select b.name, c.name from 
     sys.all_columns a 
     inner join 
     sys.tables b 
     on 
     a.object_id = b.object_id 
     inner join 
     sys.default_constraints c 
     on a.default_object_id = c.object_id 
     where 
      b.name <> 'sysdiagrams' 
      and a.name = 'EnteredDate' -- column name 
      and b.type = 'U' 

OPEN constraint_cursor 
FETCH NEXT FROM constraint_cursor INTO @TableName, @ConstraintName 

WHILE @@FETCH_STATUS = 0 
    BEGIN 
     DECLARE @SqlScript VARCHAR(255) = '' 
     SET @SqlScript = 'sp_rename ' + @ConstraintName + ', ''DF_' + @TableName + '_EnteredDate'', ''object''' 
     EXEC(@SqlScript) 
     SELECT @TableName, @ConstraintName, 'DF_' + @TableName + '_EnteredDate', @SqlScript 
     FETCH NEXT FROM constraint_cursor INTO @TableName, @ConstraintName 
    END 
CLOSE constraint_cursor; 
DEALLOCATE constraint_cursor; 
0

कुछ और खुदाई के बाद, मैंने पाया है कि यह वास्तव में इस रूप में हो गया है:

EXEC sp_rename N'schema.MyIOldConstraint', N'MyNewConstraint', N'OBJECT' 

Source

0

आधार user906573 की स्क्रिप्ट। डेटाबेस में सभी डिफ़ॉल्टों का नाम बदलने के लिए एक स्क्रिप्ट उत्पन्न करें। बाधाओं को ठीक करने के लिए उपयोगी जिन्हें स्पष्ट रूप से समय पर नामित नहीं किया गया था।

-- 
-- Generates a script to rename defaults to the pattern DF_tablename_columnname 
-- 

DECLARE @TableName VARCHAR(255), @ConstraintName VARCHAR(255), @ColumnName varchar(255), @SchemaName varchar(255) 
DECLARE constraint_cursor CURSOR 
    FOR 
     select b.name, c.name, a.name, sc.name 
     from sys.all_columns a 
     inner join sys.tables b on a.object_id = b.object_id 
     join sys.schemas sc on b.schema_id = sc.schema_id 
     inner join sys.default_constraints c on a.default_object_id = c.object_id 
     where 
      b.name <> 'sysdiagrams' 
      and b.type = 'U' 

OPEN constraint_cursor 
FETCH NEXT FROM constraint_cursor INTO @TableName, @ConstraintName, @ColumnName, @SchemaName 

WHILE @@FETCH_STATUS = 0 
    BEGIN 
     DECLARE @SqlScript VARCHAR(255) = '' 
     SET @SqlScript = 'sp_rename ''' + @SchemaName + '.' + @ConstraintName + ''', ''' + @SchemaName + '.DF_' + @TableName + '_' + @ColumnName + ''', ''object''' + char(13) + char(10) + 'GO' + char(13) + char(10) 
     --EXEC(@SqlScript) 
     print @sqlscript 
     FETCH NEXT FROM constraint_cursor INTO @TableName, @ConstraintName, @ColumnName, @SchemaName 
    END 
CLOSE constraint_cursor; 
DEALLOCATE constraint_cursor; 
3

मैं कर्सर का बड़ा प्रशंसक नहीं हूं और इसे और अधिक आसानी से लिखा जा सकता है।

DECLARE @SQLCmd varchar(MAX) = '' 
SELECT 
    @SQLCmd += 'EXEC sp_rename ''' + dc.name + ''', ''DF' + 
       OBJECT_NAME(dc.parent_object_id) + c.name + ''', ''OBJECT'';' 
FROM 
    sys.default_constraints dc 
    JOIN sys.columns c 
     ON c.object_id = dc.parent_object_id 
     AND c.column_id = dc.parent_column_id 
WHERE 
    dc.name != 'DF' + object_name(dc.parent_object_id) + c.name 
    AND OBJECT_NAME(dc.parent_object_id) != 'dtproperties' 
EXEC(@SqlCmd) 
0

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

BEGIN TRAN 

DECLARE @sql varchar(MAX) = '...' 

WHILE LEN(@sql) > 0 BEGIN 
     SET @sql = ''; 

     SELECT TOP 50 @sql = @sql 
       + 'EXEC sp_rename N''' + SCHEMA_NAME(dc.[schema_id]) + '.' + dc.name 
       + ''', N''DF_' + OBJECT_NAME(dc.parent_object_id) + '_' + c.name 
       + ''', ''OBJECT'';' + CHAR(10) 
     FROM sys.default_constraints dc 
     inner join sys.columns c 
       ON c.object_id = dc.parent_object_id AND c.column_id = dc.parent_column_id 
     WHERE dc.name LIKE 'DF[_][_]%' -- rename any auto named defaults 

     PRINT @sql 
     EXEC(@sql) 

     IF @@ERROR <> 0 BEGIN 
       IF @@TRANCOUNT > 0 ROLLBACK TRAN 
       BREAK; 
     END 
END 

IF @@TRANCOUNT > 0 COMMIT TRAN 
--IF @@TRANCOUNT > 0 ROLLBACK TRAN 
संबंधित मुद्दे