2009-11-09 19 views
5

मैं एक सी # यूनिट परीक्षण लिख रहा हूं जो लक्ष्य डेटाबेस के विरुद्ध एक ओआरएम कक्षा के लिए स्ट्रिंग गुणों को मान्य करता है, हमेशा SQL 2008, और वह डेटा जो डेटा मैप करता है।एसक्यूएल 2008 - INFORMATION_SCHEMA में विदेशी कुंजी बाधाएं

जाँच हो रही है कि एक निर्दिष्ट विदेशी कुंजी डीबी में मान्य है आसान है:

static private bool ConstraintExsits(string table, string column, ConstraintType constraintType) 
    { 
     string constraintTypeWhereClause; 
     switch (constraintType) 
     { 
      case ConstraintType.PrimaryKey: 
       constraintTypeWhereClause = "PRIMARY KEY"; 
       break; 
      case ConstraintType.ForeignKey: 
       constraintTypeWhereClause = "FOREIGN KEY"; 
       break; 
      default: 
       throw new ArgumentOutOfRangeException("constraintType"); 
     } 

     var cmd = new SqlCommand(
          @"SELECT a.CONSTRAINT_NAME 
          FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS a 
          JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE b on a.CONSTRAINT_NAME = b.CONSTRAINT_NAME 
          WHERE a.TABLE_NAME = @table AND b.COLUMN_NAME = @column AND a.CONSTRAINT_TYPE = '" + constraintTypeWhereClause + "'", 
          Connection); 
     cmd.Parameters.AddWithValue("@table", table.Trim('[').Trim(']')); 
     cmd.Parameters.AddWithValue("@column", column.Trim('[').Trim(']')); 
     return !string.IsNullOrEmpty((string)cmd.ExecuteScalar()); 
    } 

अब निम्नलिखित विदेशी कुंजी रिश्ते ले:

alt text

मेरा प्रश्न: मैं कैसे क्वेरी है 'प्राथमिक/अद्वितीय कुंजी बेस तालिका' और 'प्राथमिक/अद्वितीय कुंजी कॉलम' पक्ष से संबंध? मैं इन्हें INFORMATION_SCHEMA विचारों में संदर्भित नहीं देख सकता।

धन्यवाद जम्मू

उत्तर

9

यह एसक्यूएल है कि मैं के बाद किया गया है!

SELECT 
FK_Table = FK.TABLE_NAME, 
FK_Column = CU.COLUMN_NAME, 
PK_Table = PK.TABLE_NAME, 
PK_Column = PT.COLUMN_NAME, 
Constraint_Name = C.CONSTRAINT_NAME 
FROM 
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
INNER JOIN 
INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK 
    ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
INNER JOIN 
INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
    ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
INNER JOIN 
INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU 
    ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME 
INNER JOIN 
( 
    SELECT 
     i1.TABLE_NAME, i2.COLUMN_NAME 
    FROM 
     INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 
     INNER JOIN 
     INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 
     ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
     WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY' 
) PT 
ON PT.TABLE_NAME = PK.TABLE_NAME 
+0

बहुत खूब! धन्यवाद। –

3

जेमी के जवाब सही ढंग से सभी विदेशी कुंजी वापस जाने के लिए है क्योंकि यह UNIQUE_CONSTRAINT_NAME स्तंभ का उपयोग करता है के लिए भेजा तालिका (तालिका है कि विदेशी कुंजी के खिलाफ लग रही है) एक अद्वितीय कुंजी है विफल रहता है। मेरा सुझाव है:

SELECT 
    FK = fk.name, 
    FKTable = QUOTENAME(OBJECT_SCHEMA_NAME(fkcol.[object_id])) 
     + '.' + QUOTENAME(OBJECT_NAME(fkcol.[object_id])), 
    FKCol = fkcol.name, 
    ' references => ', 
    PKTable = QUOTENAME(OBJECT_SCHEMA_NAME(pkcol.[object_id])) 
     + '.' + QUOTENAME(OBJECT_NAME(pkcol.[object_id])), 
    PKCol = pkcol.name 
FROM sys.foreign_keys AS fk 
INNER JOIN sys.foreign_key_columns AS fkc 
ON fk.[object_id] = fkc.constraint_object_id 
INNER JOIN sys.columns AS fkcol 
ON fkc.parent_object_id = fkcol.[object_id] 
AND fkc.parent_column_id = fkcol.column_id 
INNER JOIN sys.columns AS pkcol 
ON fkc.referenced_object_id = pkcol.[object_id] 
AND fkc.referenced_column_id = pkcol.column_id 
ORDER BY fkc.constraint_column_id; 

स्रोत: http://sqlblog.com/blogs/aaron_bertrand/archive/2011/11/03/the-case-against-information-schema-views.aspx

संबंधित मुद्दे