2009-04-19 16 views
5

一部の主キーを非クラスタ化からクラスタ化に変更する必要がありますが、他の外部キーから参照されているため、制約を削除できません。SQL 2005 SMO - 参照テーブルの検索

DB内のすべてのテーブルをループせずに、外部テーブルのプライマリキーを参照するテーブルを外部関係の一部として見つけるにはどうすればよいですか?私はそれらの制約を無効にし、PKを変更して再度有効にする必要があります。

アップデート:私はSMOが、これを行うには、プレーンSQLを使用したくない

  1. 。 (私のテーブルの主キーを参照しているすなわちテーブル) table.PrimaryKey.ForeignKeys 私はちょうどデータベースとチェック内のすべてのテーブルをループを回避したい:私はのようなものを必要とすることにより、

  2. マークは、私がのForeignKeyについて知っていますそれらのいずれかが私のテーブルを参照する場合は、それらの一つ一つ上のForeignKeyプロパティを確認します。(スケーラブルではありません)

答えて

5

私はそれを見つけたと思う。

table.Columns[0].EnumForeignKeys() 

直接

table.EnumForeignKeys()

私の代わりに関数の特性を期待していました。私はかなり裏で、cmsjrが提案したことをしていると確信しています。

+0

私の読書はそれはヨーヨーが欲しいものないということである(ちょうど見た、このほかに気づくことができませんでした!) – Murph

2

あなたはINFORMATION_SCHEMAビューを使用することができます。

INFORMATION_SCHEMA.TABLE_CONSTRAINTSは、そのテーブルの主キーの名前を示します。あなたは、このような、しかし、与えられたとしてINFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE

ないSMOを照会することによってINFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS

からこれらのキーを使用して参照制約そしてテーブル名を取得することができ、主キーの名前を考える

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = @TableName

上では、無効にする必要がある制約をリストするクエリをまとめることができます。 SMOを使用して

4

、あなたはこれを行うことができます:

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

マルク・

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

私のためには機能しません。

以下の関係を考慮してください。

表1 - >マスターテーブル。 テーブル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")); 
       } 
      } 

ここで、 "urns"はtable.Urnのコレクションです。

1

依存関係のツリーを移動する必要があります。 以下は、SMOを使用してCreate TableスクリプトとInsertスクリプトを生成するスクリプトです。 MSDNの

**

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

**

関連する問題