2012-03-23 15 views
8

मेरे पास लगभग 100 टेबल हैं जहां उनमें से सभी पर डुप्लिकेट विदेशी कुंजी बाधाएं हैं।डुप्लिकेट विदेशी कुंजी छोड़ना

क्या कोई तरीका है कि मैं इससे छुटकारा पा सकता हूं? क्या कोई प्रश्न है जो मुझे इसमें सभी डुप्लिकेट कुंजी दे सकता है?

उत्तर

10

मैं संभावित रूप से डुप्लिकेट एफके बाधाओं का पता लगाने के लिए यहां इस टी-एसक्यूएल स्क्रिप्ट का उपयोग कर रहा हूं - और यह आउटपुट कॉलम के अंतिम में आवश्यक ALTER TABLE...DROP CONSTRAINT कथन भी उत्पन्न करता है।

आप विश्वसनीय रूप से स्वचालित रूप से पहचान नहीं सकते हैं और कई एफके बाधाओं को छोड़ने के लिए चुन सकते हैं - इसलिए आप मूल रूप से उन्हें पहचानने के लिए बाएं हैं और फिर मैन्युअल रूप से कौन से ड्रॉप (मेरी क्वेरी द्वारा उत्पादित उस ड्रॉप स्टेटमेंट का उपयोग करके) चुनते हैं।

;WITH FKData AS 
(
    SELECT 
     fk.parent_object_id, 
     fkc.parent_column_id, 
     fk.referenced_object_id, 
     fkc.referenced_column_id, 
     FKCount = COUNT(*) 
    FROM 
     sys.foreign_keys fk 
    INNER JOIN 
     sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id 
    GROUP BY 
     fk.parent_object_id, fkc.parent_column_id, fk.referenced_object_id, fkc.referenced_column_id 
    HAVING 
     COUNT(*) > 1 
), 
DuplicateFK AS 
(
    SELECT 
     FKName = fk.Name, 
      ParentSchema = s1.Name, 
     ParentTable = t1.Name, 
     ParentColumn = c1.Name, 
     ReferencedTable = t2.Name, 
     ReferencedColumn = c2.Name 
    FROM 
     sys.foreign_keys fk 
    INNER JOIN 
     sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id 
    INNER JOIN 
     FKData f ON fk.parent_object_id = f.parent_object_id 
       AND fk.referenced_object_id = f.referenced_object_id 
       AND fkc.parent_column_id = f.parent_column_id 
       AND fkc.referenced_column_id = f.referenced_column_id 
    INNER JOIN 
     sys.tables t1 ON f.parent_object_id = t1.object_id 
    INNER JOIN 
     sys.columns c1 ON f.parent_object_id = c1.object_id AND f.parent_column_id = c1.column_id 
INNER JOIN 
    sys.schemas s1 ON t1.schema_id = s1.schema_id 
    INNER JOIN 
     sys.tables t2 ON f.referenced_object_id = t2.object_id 
    INNER JOIN 
     sys.columns c2 ON f.referenced_object_id = c2.object_id AND f.referenced_column_id = c2.column_id 
) 
SELECT 
    FKName, 
    ParentSchema, ParentTable, ParentColumn, 
    ReferencedTable, ReferencedColumn, 
    DropStmt = 'ALTER TABLE ' + ParentSchema + '.' + ParentTable + 
       ' DROP CONSTRAINT ' + FKName 
FROM 
    DuplicateFK 
+0

बहुत बढ़िया धन्यवाद निकाल देता है !! – peter

+0

क्या कोई तरीका है कि हम स्कीमा नाम भी प्राप्त कर सकते हैं? चूंकि कुछ ऐसे हैं जो डीबीओ स्कीमा से संबंधित नहीं हैं। – peter

+1

@ पीटर: ** ठीक है! ** माता-पिता स्कीमा को शामिल करने के लिए मेरी प्रतिक्रिया अपडेट की गई है (यदि आवश्यक हो तो आपको संदर्भित स्कीमा भी मिल सकता है - लेकिन आपको डीआरओपी कथन के लिए इसकी आवश्यकता नहीं है) –

2

एक 100 तालिकाओं के लिए यह एक विकल्प नहीं है, लेकिन आप बस कुछ ही टेबल है, तब SQL सर्वर प्रबंधन स्टूडियो में एक चित्र बनाने आपकी टेबल जोड़ सकते हैं और नेत्रहीन ड्यूप्स को हटा दें।

0

यह सबसे हाल ही में बनाए गए डुप्लिकेट

;WITH fkeys AS (
SELECT f.object_id , 
     f.name , 
     f.parent_object_id, 
     ROW_NUMBER() OVER(PARTITION BY t.column_names ORDER BY f.create_date,f.[object_id]) AS RowNum 
FROM sys.foreign_keys f 
     CROSS APPLY (SELECT fc.parent_object_id,parent_column_id,fc.referenced_object_id ,fc.referenced_column_id 
         FROM  sys.foreign_key_columns fc 
         WHERE  fc.constraint_object_id = f.object_id 
         ORDER BY constraint_column_id 
        FOR XML PATH('') 
        ) t (column_names) 
) 
SELECT 'ALTER TABLE '+QUOTENAME(OBJECT_SCHEMA_NAME(f.parent_object_id)) + '.'+QUOTENAME(OBJECT_NAME(f.parent_object_id)) +' DROP CONSTRAINT '+QUOTENAME(f.name)+';' AS DropStatement 
FROM fkeys f 
WHERE f.RowNum >= 2 
संबंधित मुद्दे