प्राथमिक कुंजी का नाम बदलने के लिए बस PK_TableName
रहे हैं:
CREATE PROCEDURE dbo.Rename_PrimaryKeys
@PrintOnly BIT = 1
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';
SELECT @sql = @sql + CHAR(13) + CHAR(10) + 'EXEC sp_rename '''
+ REPLACE(name, '''', '''''') + ''', ''PK_'
+ REPLACE(OBJECT_NAME(parent_object_id), '''', '') + ''', ''OBJECT'';'
FROM sys.key_constraints
WHERE type = 'PK'
AND name <> 'PK_' + REPLACE(OBJECT_NAME(parent_object_id), '''', '')
AND OBJECTPROPERTY(parent_object_id, 'IsMsShipped') = 0;
PRINT @sql;
IF @PrintOnly = 0 AND @sql > N''
BEGIN
EXEC sp_executesql @sql;
END
END
GO
योजना FK_TableName_col_col_ReferencedName_col_col
साथ FKS नाम बदलने के लिए:
CREATE PROCEDURE dbo.Rename_ForeignKeys_WithColumns
@PrintOnly BIT = 1
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';
SELECT @sql = @sql + CHAR(13) + CHAR(10)
+ 'EXEC sp_rename ''' + REPLACE(name, '''', '''''')
+ ''', ''FK_' + REPLACE(OBJECT_NAME(fk.parent_object_id), '''', '')
+ '_' + STUFF((SELECT '_' + REPLACE(c.name, '''', '')
FROM sys.columns AS c
INNER JOIN sys.foreign_key_columns AS fkc
ON fkc.parent_column_id = c.column_id
AND fkc.parent_object_id = c.[object_id]
WHERE fkc.constraint_object_id = fk.[object_id]
ORDER BY fkc.constraint_column_id
FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'), 1, 1, '')
+ '_' + REPLACE(OBJECT_NAME(fk.referenced_object_id), '''', '')
+ '_' + STUFF((SELECT '_' + REPLACE(c.name, '''', '')
FROM sys.columns AS c
INNER JOIN sys.foreign_key_columns AS fkc
ON fkc.referenced_column_id = c.column_id
AND fkc.referenced_object_id = c.[object_id]
WHERE fkc.constraint_object_id = fk.[object_id]
ORDER BY fkc.constraint_column_id
FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'), 1, 1, '')
+ ''', ''OBJECT'';'
FROM sys.foreign_keys AS fk
WHERE OBJECTPROPERTY(parent_object_id, 'IsMsShipped') = 0;
PRINT @sql;
IF @PrintOnly = 0 AND @sql > N''
BEGIN
EXEC sp_executesql @sql;
END
END
GO
विदेशी कुंजी के लिए अगर आप सिर्फ FK_TableName_ReferencedName
चाहते तो यह बहुत आसान है:
CREATE PROCEDURE dbo.Rename_ForeignKeys
@PrintOnly BIT = 1
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';
SELECT @sql = @sql + CHAR(13) + CHAR(10) + 'EXEC sp_rename '''
+ REPLACE(name, '''', '''''') + ''', ''FK_'
+ REPLACE(OBJECT_NAME(parent_object_id), '''', '')
+ '_' + REPLACE(OBJECT_NAME(referenced_object_id), '''', '')
+ ''', ''OBJECT'';'
FROM sys.foreign_keys
WHERE OBJECTPROPERTY(parent_object_id, 'IsMsShipped') = 0;
PRINT @sql;
IF @PrintOnly = 0 AND @sql > N''
BEGIN
EXEC sp_executesql @sql;
END
END
GO
इंडेक्स के लिए, यह किसी का नाम बदल देगा I ndexes IX_TableName_Col1_Col2...
। यह प्राथमिक कुंजी को अनदेखा कर देगा (क्योंकि उन्हें अलग से निपटाया जाता है), UQ_
अद्वितीय इंडेक्स/बाधाओं (इसलिए IX_UQ_TableName_Col1_Col2...
) में अद्वितीय बाधाओं और अद्वितीय इंडेक्स का इलाज करेगा, और कॉलम को अनदेखा कर देगा। (ध्यान दें कि शामिल कॉलम को अनदेखा कर सकता है एक नामकरण संघर्ष करता है, तो आप अनावश्यक अनुक्रमित है कि केवल शामिल कॉलम से अलग है उत्पादन)
CREATE PROCEDURE dbo.Rename_Indexes
@PrintOnly BIT = 1
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';
SELECT @sql = @sql + CHAR(13) + CHAR(10)
+ 'EXEC sp_rename ''' + REPLACE(i.name, '''', '''''')
+ ''', ''IX_' + CASE is_unique_constraint WHEN 1 THEN 'UQ_' ELSE '' END
+ REPLACE(OBJECT_NAME(i.[object_id]), '''', '')
+ '_' + STUFF((SELECT '_' + REPLACE(c.name, '''', '')
FROM sys.columns AS c
INNER JOIN sys.index_columns AS ic
ON ic.column_id = c.column_id
AND ic.[object_id] = c.[object_id]
WHERE ic.[object_id] = i.[object_id]
AND ic.index_id = i.index_id
AND is_included_column = 0
ORDER BY ic.index_column_id
FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'), 1, 1, '')
+''', ''OBJECT'';'
FROM sys.indexes AS i
WHERE index_id > 0
AND is_primary_key = 0 -- dealt with separately
AND OBJECTPROPERTY(i.[object_id], 'IsMsShipped') = 0;
PRINT @sql;
IF @PrintOnly = 0 AND @sql > N''
BEGIN
EXEC sp_executesql @sql;
END
END
GO
डिफ़ॉल्ट की कमी के लिए:। जाँच
CREATE PROCEDURE dbo.Rename_DefaultConstraints
@PrintOnly BIT = 1
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';
SELECT @sql = @sql + CHAR(13) + CHAR(10)
+ 'EXEC sp_rename ''' + REPLACE(dc.name, '''', '''''')
+ ''', ''DF_' + REPLACE(OBJECT_NAME(dc.parent_object_id), '''','')
+ '_' + REPLACE(c.name, '''', '') + ''', ''OBJECT'';'
FROM sys.default_constraints AS dc
INNER JOIN sys.columns AS c
ON dc.parent_object_id = c.[object_id]
AND dc.parent_column_id = c.column_id
AND OBJECTPROPERTY(dc.parent_object_id, 'IsMsShipped') = 0;
PRINT @sql;
IF @PrintOnly = 0 AND @sql > N''
BEGIN
EXEC sp_executesql @sql;
END
END
GO
और अंत में कमी:
CREATE PROCEDURE dbo.Rename_CheckConstraints
@PrintOnly BIT = 1
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';
SELECT @sql = @sql + CHAR(13) + CHAR(10)
+ 'EXEC sp_rename ''' + REPLACE(cc.name, '''', '''''')
+ ''', ''CK_' + REPLACE(OBJECT_NAME(cc.parent_object_id), '''','')
+ '_' + REPLACE(c.name, '''', '') + ''', ''OBJECT'';'
FROM sys.check_constraints AS cc
INNER JOIN sys.columns AS c
ON cc.parent_object_id = c.[object_id]
AND cc.parent_column_id = c.column_id
AND OBJECTPROPERTY(dc.parent_object_id, 'IsMsShipped') = 0;
PRINT @sql;
IF @PrintOnly = 0 AND @sql > N''
BEGIN
EXEC sp_executesql @sql;
END
END
GO
ध्यान दें कि PRINT
टेक्स्ट में परिणामों और कथन के आकार के लिए आपकी सेटिंग्स के आधार पर, संपूर्ण विवरण को जरूरी नहीं बताएगा। लेकिन यह आंखों के लिए पर्याप्त होना चाहिए कि स्क्रिप्ट सही काम कर रहे हैं। मैं उन्हें डिफ़ॉल्ट रूप से PrintOnly
पर सेट करता हूं।
आप और अधिक नियमों को निर्दिष्ट कर सकते हैं, उदाहरण के लिए यदि आपकी अनुक्रमणिका फ़िल्टर की गई है या कॉलम शामिल है, तो क्या आप उन्हें भी निर्दिष्ट करना चाहते हैं, या केवल कुंजी कॉलम? चेक बाधाओं और अद्वितीय बाधाओं के बारे में क्या? –
मेरे पास नहीं कह सकता है, लेकिन मैं सामान बनाने के लिए कभी भी GUI का उपयोग नहीं करता, और मैं हमेशा स्क्रिप्ट में अपना सामान नाम देता हूं। आप उपर्युक्त उपर्युक्त कर सकते हैं, लेकिन मुझे लगता है कि उपरोक्त को समझने के बजाय डीबी को स्क्रिप्ट करना और संपादित करना आसान होगा। –
एक और विचार यह है कि उन वस्तुओं से निपटने का तरीका जो उनके नाम पर अंडरस्कोर हैं। उस मामले के लिए विदेशी कुंजी के ऑब्जेक्ट नाम को पढ़ने में काफी भ्रमित हो सकता है, जहां 'Document_Folder' का नाम' फ़ोल्डर 'नाम' कॉलर 'नामक' फ़ोल्डर 'नामक कॉलम द्वारा संदर्भित किया गया है। 'FK_Document_Folder_Name_Document_Folder_Folder_Name'? मुझे यकीन नहीं है कि सिस्टम से उत्पन्न नाम 'FK__Document__Docum__1DE57479' से अधिक उपयोगी है ... –