मेरे पास लगभग 100 टेबल हैं जहां उनमें से सभी पर डुप्लिकेट विदेशी कुंजी बाधाएं हैं।डुप्लिकेट विदेशी कुंजी छोड़ना
क्या कोई तरीका है कि मैं इससे छुटकारा पा सकता हूं? क्या कोई प्रश्न है जो मुझे इसमें सभी डुप्लिकेट कुंजी दे सकता है?
मेरे पास लगभग 100 टेबल हैं जहां उनमें से सभी पर डुप्लिकेट विदेशी कुंजी बाधाएं हैं।डुप्लिकेट विदेशी कुंजी छोड़ना
क्या कोई तरीका है कि मैं इससे छुटकारा पा सकता हूं? क्या कोई प्रश्न है जो मुझे इसमें सभी डुप्लिकेट कुंजी दे सकता है?
मैं संभावित रूप से डुप्लिकेट एफके बाधाओं का पता लगाने के लिए यहां इस टी-एसक्यूएल स्क्रिप्ट का उपयोग कर रहा हूं - और यह आउटपुट कॉलम के अंतिम में आवश्यक 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
एक 100 तालिकाओं के लिए यह एक विकल्प नहीं है, लेकिन आप बस कुछ ही टेबल है, तब SQL सर्वर प्रबंधन स्टूडियो में एक चित्र बनाने आपकी टेबल जोड़ सकते हैं और नेत्रहीन ड्यूप्स को हटा दें।
यह सबसे हाल ही में बनाए गए डुप्लिकेट
;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
बहुत बढ़िया धन्यवाद निकाल देता है !! – peter
क्या कोई तरीका है कि हम स्कीमा नाम भी प्राप्त कर सकते हैं? चूंकि कुछ ऐसे हैं जो डीबीओ स्कीमा से संबंधित नहीं हैं। – peter
@ पीटर: ** ठीक है! ** माता-पिता स्कीमा को शामिल करने के लिए मेरी प्रतिक्रिया अपडेट की गई है (यदि आवश्यक हो तो आपको संदर्भित स्कीमा भी मिल सकता है - लेकिन आपको डीआरओपी कथन के लिए इसकी आवश्यकता नहीं है) –