【问题标题】:SQL 2008 - Foreign key constraints in the INFORMATION_SCHEMA viewSQL 2008 - INFORMATION_SCHEMA 视图中的外键约束
【发布时间】:2009-11-09 10:48:52
【问题描述】:

我正在编写一个 c# 单元测试,它针对目标数据库(始终是 SQL 2008)以及数据映射到的类验证 ORM 类的字符串属性。

检查指定的外键在数据库中是否有效很容易:

    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());
    }

现在采用以下外键关系:

我的问题:如何从“主/唯一键基表”和“主/唯一键列”端查询关系?我在 INFORMATION_SCHEMA 视图中看不到这些引用。

谢谢 J

【问题讨论】:

    标签: c# sql orm


    【解决方案1】:

    这是我所追求的 SQL!

    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 
    

    【讨论】:

      【解决方案2】:

      如果引用的表(外键正在查看的表)具有唯一键,则 Jaimie 的答案无法正确返回所有外键,因为它使用 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;
      

      来源:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-03
        • 2013-01-30
        • 2013-01-01
        • 1970-01-01
        • 2013-04-10
        • 2017-06-17
        • 1970-01-01
        相关资源
        最近更新 更多