6

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

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

アップデート:

  1. これを行うためにプレーン SQL を使用したくはありませんが、SMO のみを使用します。

  2. マーク、私は次のようなものが必要であることによって、ForeignKeys について知っています:そのうちの1つが私のテーブルを参照しているかどうかを確認します.(スケーラブルではありません)

4

6 に答える 6

8

わかりました、見つけたと思います。

table.Columns[0].EnumForeignKeys()

または直接

table.EnumForeignKeys()

関数ではなくプロパティを期待していました。cmsjrが提案したことを舞台裏で行うと確信しています。

于 2009-04-19T18:28:17.923 に答える
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);
}

マルク

于 2009-04-19T15:44:43.247 に答える
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);
于 2009-04-19T15:48:56.637 に答える
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 そのものではありませんが、上記を踏まえると、無効にする必要がある制約を一覧表示するクエリをまとめることができるはずです。

于 2009-04-19T15:43:35.433 に答える
1

それは私にはうまくいきません。

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

Table1->マスターテーブル; 表2->スレーブテーブル;

Table2.Table1_IDは、Table1.IDの外部キーです。

Table1.EnumForeignKeys()はnullを返します。

代わりに、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のコレクションです。

于 2009-11-15T16:35:15.207 に答える
1

依存関係ツリーをたどる必要があります。以下は、SMO を使用してテーブルの作成と挿入スクリプトを生成するスクリプトです。

**

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

**

于 2011-07-20T12:41:17.770 に答える