2009-04-19 4 views
5

Мне нужно изменить некоторые первичные ключи из кластеризованных кластеров, но я не могу отказаться от ограничения, потому что на него ссылаются другие внешние ключи.SQL 2005 SMO - найти ссылочную таблицу

Как найти таблицы, которые ссылаются на первичный ключ в родительской таблице как часть внешнего отношения, без перебора всех таблиц в БД? Мне нужно отключить ограничения на них, изменить PK и снова включить.

Update:

  1. Я не хочу использовать простой SQL, чтобы сделать это, но только SMO.

  2. Марк, я знаю о ForeignKeys по мне нужно что-то вроде: table.PrimaryKey.ForeignKeys (т.е. какие таблицы ссылающихся первичный ключ моей таблицы) Я просто хочу, чтобы избежать зацикливания через все таблицы в базе данных и проверки свойство ForeignKeys на каждом и каждый из них, чтобы увидеть, если любой из них ссылки на мой стол. (не масштабируется)

ответ

5

ОК Я думаю, что нашел.

table.Columns[0].EnumForeignKeys() 

или непосредственно

table.EnumForeignKeys()

Я ожидал, что свойство вместо функции. Я уверен, что за кулисами он делает то, что предложил cmsjr.

+0

Мое чтение MSDN является то, что он делает то, что лет хотят (только что посмотрел, не сумев заметить это дополнение!) – Murph

2

Вы можете использовать INFORMATION_SCHEMA просмотров.

INFORMATION_SCHEMA.TABLE_CONSTRAINTS даст вам имена первичных ключей на этой таблице.

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = @TableName

Учитывая первичные имена ключей вы можете получить реляционные ограничения, которые используют эти ключи от INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS

, а затем имена таблиц, запрашивая INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE

Не SMO как таковой, но, учитывая выше вы должны иметь возможность собрать запрос, в котором будут перечислены ограничения, которые необходимо отключить.

4

Используя SMO, вы можете сделать это:

using Microsoft.SqlServer.Management.Smo; 

Server localServer = new Server("your server name"); 
Database dasecoDB = localServer.Databases["your database name"]; 

Table table = dasecoDB.Tables["your table name"]; 
foreach(ForeignKey fk in table.ForeignKeys) 
{ 
    Console.WriteLine("Foreign key {0} references table {1} and key {2}", fk.Name, fk.ReferencedTable, fk.ReferencedKey); 
} 

Marc

3

Этот запрос должен работать, и может быть выполнена с использованием Database.ExecuteWithResults

Select fk.Table_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 
where PK.Table_Name = 'SomeTable' 

например

SqlConnection sqlConnection = 
new SqlConnection(@"Integrated Security=SSPI; Data Source=SomeInstance"); 
Server server = new Server(serverConnection); 
Database db = server.Databases["somedatabase"]; 
DataSet ds = db.ExecuteWithResults(thesqlabove); 
1

Это не работает для меня.

Рассмотрим следующие соотношения:

Table1 -> мастер-таблицы; Таблица2 -> табличный стол;

Table2.Table1_ID является внешним ключом Table1.ID

Table1.EnumForeignKeys() возвращает нуль.

Вместо этого я успешно использовал объект DependencyWalker. В следующем коде перечислены все таблицы, которые различаются из данного набора таблиц.

  DependencyWalker w = new DependencyWalker(db.Parent); 
      DependencyTree tree = w.DiscoverDependencies(urns,false); 
      DependencyCollection depends = w.WalkDependencies(tree); 

      foreach (DependencyCollectionNode dcn in depends) 
      { 
       if (dcn.Urn.Type == "Table") 
       { 
        dcn.Urn.GetNameForType("Table"); 
        Console.WriteLine(dcn.Urn.GetNameForType("Table")); 
       } 
      } 

где «урны» представляет собой коллекцию table.Urn.

1

Вам придется путешествовать по дереву зависимостей. Ниже приведен сценарий, который использует SMO для создания таблицы Create и вставки.

**

**ServerConnection conn = new ServerConnection(GetConnection()); 
      Server server = new Server(conn); 
      Database db = server.Databases[ mDestinationDatabase ]; 
      // Create database script 
      StringBuilder dbScript = new StringBuilder(); 
      ScriptingOptions dbCreateOptions = new ScriptingOptions(); 
      dbCreateOptions.DriAll = true; 
      dbCreateOptions.NoCollation = true; 
      StringCollection coll = db.Script(dbCreateOptions); 
      foreach(string str in coll) 
      { 
       dbScript.Append(str); 
       dbScript.Append(Environment.NewLine); 
      } 
      sqlInsertCommands = dbScript.ToString(); 
      // Create dependency tree 
      DependencyWalker w = new DependencyWalker(db.Parent); 
      UrnCollection urnCollection = new UrnCollection(); 
      DataTable table = db.EnumObjects(DatabaseObjectTypes.Table); 
      string tableName = string.Empty; 
      foreach(DataRow row in table.Rows) 
      { 
       urnCollection.Add(new Urn((string)row[ "Urn" ])); 
      } 
      DependencyTree tree = w.DiscoverDependencies(urnCollection, true); 
      DependencyCollection depends = w.WalkDependencies(tree); 
      // walk through the dependency tree and for each table generate create and insert scripts 
      foreach (DependencyCollectionNode dcn in depends) 
      { 
       if (dcn.Urn.Type == "Table") 
       { 
        tableName = dcn.Urn.GetNameForType("Table"); 
        DataTable dataTableWithData = GetTableWithData(tableName); 
        ArrayList columnList = new ArrayList(); 
        foreach(DataColumn dataColumn in dataTableWithData.Columns) 
        { 
         columnList.Add(dataColumn.ColumnName); 
        } 
        sqlInsertCommands = sqlInsertCommands + Environment.NewLine + Environment.NewLine 
         + GetCreateTableScript(tableName) 
         + Environment.NewLine + Environment.NewLine 
         + BuildInsertSQL(columnList, dataTableWithData, tableName); 
        } 
      }** 

**

Смежные вопросы