2009-04-19 35 views
5

我需要將某些主鍵從非集羣更改爲集羣,但我無法刪除該約束,因爲它是從其他外鍵引用的。SQL 2005 SMO - 查找引用表

如何查找將父表中的主鍵作爲外部關係的一部分引用而不循環訪問數據庫中的所有表的表?我需要禁用這些限制,改變PK並重新啓用。

更新:

  1. 我不想使用純SQL來做到這一點,但只有SMO。

  2. 馬克,我知道ForeignKeys由我需要的東西,如: table.PrimaryKey.ForeignKeys(即哪些表引用我的表的主鍵) 我只是想避免通過在數據庫中,檢查所有表循環他們的每一個ForeignKeys屬性,看看其中有沒有引用我的表。(不可擴展)

回答

5

好吧我想我找到了。

table.Columns[0].EnumForeignKeys() 

,或者直接

table.EnumForeignKeys()

我期待一個屬性,而不是一個函數。我非常確定在cmsjr建議的場景後面。

+0

我的MSDN的解讀是,它喲想要的(剛剛看了看,已經沒有注意到這除了!) – Murph 2009-04-20 12:27:23

2

你可以使用INFORMATION_SCHEMA意見。

INFORMATION_SCHEMA.TABLE_CONSTRAINTS將爲您提供該表上主鍵的名稱。

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = @TableName

鑑於主鍵的名稱,你可以通過查詢INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE

獲得使用這些按鍵從INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS

然後表名的引用約束不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); 
} 

馬克

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表並插入腳本的腳本。

**

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

**