Как найти все внешние ключи? - PullRequest
3 голосов
/ 22 июня 2010

Я хотел бы найти все ссылочные таблицы в моей базе данных, которые имеют внешний ключ, который указывает на конкретную ссылочную таблицу.Есть ли запрос, который я могу выполнить, чтобы сделать это?

Не уверен, что вопрос запутанный.Дайте мне знать, если это так, и я могу попытаться объяснить это более подробно.

Ответы [ 4 ]

2 голосов
/ 22 июня 2010

У меня была похожая проблема некоторое время назад.Вот сценарий, который я написал с использованием SMO Sql Server:

    public static string GetForeignKeyScript()
    {
        SqlConnection conn = new System.Data.SqlClient.SqlConnection("SOME_CONNECTION_STRING");
        Server server = new Server(new ServerConnection(conn));
        Database db = server.Databases["SOME_DATABASE"];
        Table Roles = db.Tables["SOME_TABLE"];

        var sb = new StringBuilder();

        foreach (Table table in db.Tables)
            foreach (ForeignKey fk in table.ForeignKeys)
                    foreach (string s in fk.Script())
                        sb.AppendLine(s);

        return sb.ToString();
    }

. Это выведет строку, содержащую сценарии для создания внешних ключей.

Отредактировал код, чтобы удалить материал, который был довольноспецифичные для моего проекта (например, меня интересовали только таблицы, оканчивающиеся определенной строкой)

2 голосов
/ 22 июня 2010

Будет выполнен следующий запрос или модификация - на сервере Sql. Вы также можете предоставить информацию о каталоге и схеме

select tab1.TABLE_NAME from 
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as ref inner join
INFORMATION_SCHEMA.TABLE_CONSTRAINTS as prim
on ref.UNIQUE_CONSTRAINT_NAME=prim.CONSTRAINT_NAME
and ref.UNIQUE_CONSTRAINT_CATALOG=prim.CONSTRAINT_CATALOG
and ref.UNIQUE_CONSTRAINT_SCHEMA=prim.CONSTRAINT_SCHEMA
--and prim.CONSTRAINT_TYPE in('PRIMARY KEY','UNIQUE')
inner join INFORMATION_SCHEMA.TABLE_CONSTRAINTS tab1 on
ref.CONSTRAINT_NAME=tab1.CONSTRAINT_NAME
and ref.CONSTRAINT_CATALOG=tab1.CONSTRAINT_CATALOG
and ref.CONSTRAINT_SCHEMA=tab1.CONSTRAINT_SCHEMA
where prim.TABLE_NAME='YourTablename'
0 голосов
/ 22 июня 2010
SELECT  DISTINCT
             ParentSchema.name      ParentSchema
            ,ParentTable.name       ParentTable
            ,ChildSchema.name       ChildSchema
            ,ChildTable.name        ChildTable
    FROM sys.foreign_keys       Foreign_Keys
    JOIN sys.objects            ParentTable     ON  Foreign_Keys.parent_object_id       =   ParentTable.object_id
    JOIN sys.schemas            ParentSchema    ON  ParentTable.schema_id               =   ParentSchema.schema_id
    JOIN sys.objects            ChildTable      ON  Foreign_Keys.referenced_object_id   =   ChildTable.object_id
    JOIN sys.schemas            ChildSchema     ON  ChildTable.schema_id                =   ChildSchema.schema_id
    WHERE ParentSchema.name = '??????'
      AND ParentTable.name = '??????'
0 голосов
/ 22 июня 2010

Посмотрите на метаданные:

SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
SELECT * FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
...