2009-04-19 17 views
5

Ho bisogno di cambiare alcune chiavi primarie da non cluster a cluster, ma non posso rilasciare il vincolo perché è referenziato da altre chiavi esterne.SQL 2005 SMO - trova tabella di riferimento

Come è possibile trovare le tabelle che fanno riferimento a una chiave primaria nella tabella padre come parte di una relazione esterna senza eseguire il ciclo di tutte le tabelle nel DB? Devo disabilitare i vincoli su quelli, modificare il PK e riattivare.

Aggiornamento:

  1. Non voglio usare SQL semplice per fare questo, ma solo SMO.

  2. Marc, so di ForeignKeys da Ho bisogno di qualcosa di simile: table.PrimaryKey.ForeignKeys (vale a dire che le tabelle fanno riferimento chiave primaria del mio tavolo) voglio solo evitare il loop attraverso tutte le tabelle del database e verifica la proprietà ForeignKeys su tutti e ciascuno di loro per vedere se qualcuno di loro riferimento mio tavolo. (non scalabile)

risposta

5

Ok penso di averlo trovato.

table.Columns[0].EnumForeignKeys() 

o direttamente

table.EnumForeignKeys()

mi aspettavo una proprietà invece di una funzione. Sono abbastanza sicuro dietro le quinte che fa ciò che Cmsjr ha suggerito.

+0

La mia lettura di MSDN è che fa quello che vuole anni (avendo appena guardato, non essendo riuscito a notare questa aggiunta!) – Murph

2

è possibile utilizzare il INFORMATION_SCHEMA Visualizzazioni.

INFORMATION_SCHEMA.TABLE_CONSTRAINTS ti darà i nomi delle chiavi primarie su quella tabella.

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = @TableName

Visti i nomi di chiave primaria si possono ottenere i vincoli referenziali che utilizzano tali chiavi dalla INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS

E poi i nomi delle tabelle interrogando INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE

Non smo in quanto tale, ma data la sopra devi essere in grado di mettere insieme una query che elencherà i vincoli che devi disabilitare.

4

Utilizzando SMO, si potrebbe fare questo:

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

Questa query dovrebbe funzionare, e potrebbe essere eseguita utilizzando 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' 

esempio

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

Non funziona per me.

Considerate le seguenti relazioni:

Tabella 1 -> tabella master; Tabella2 -> tabella slave;

Table2.Table1_ID è una chiave esterna di Table1.ID

Table1.EnumForeignKeys() ritorno nullo.

Invece ho provato con successo l'oggetto DependencyWalker. Il seguente codice elenca tutte le tabelle che dipendono da una determinata raccolta di tabelle.

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

dove "urne" è una raccolta di table.Urn.

1

Dovrete viaggiare attraverso l'albero delle dipendenze. Di seguito è riportato lo script che utilizza SMO per generare la tabella Crea e inserire lo script.

**

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

**