2009-04-19 6 views
5

Necesito cambiar algunas claves primarias de no agrupado a agrupado, pero no puedo eliminar la restricción porque está referenciada desde otras claves foráneas.SQL 2005 SMO - encuentre la tabla de referencia

¿Cómo puedo encontrar las tablas que hacen referencia a una clave principal en la tabla principal como parte de una relación ajena sin recorrer todas las tablas en el DB? Necesito desactivar las restricciones en esos, cambiar PK y volver a habilitar.

Actualización:

  1. no quiero utilizar SQL sencilla de hacer esto, pero sólo SMO.

  2. Marc, que sé de ForeignKeys por lo que necesito algo como: table.PrimaryKey.ForeignKeys (es decir, las tablas que hacen referencia a la clave primaria de mi mesa) sólo quiero evitar bucle a través de todas las tablas de la base de datos y verificación ForeignKeys la propiedad de todos y cada uno de ellos para ver si alguno de ellos hacen referencia a mi mesa. (no ampliable)

Respuesta

5

Ok Creo que lo he encontrado.

table.Columns[0].EnumForeignKeys() 

o directamente

table.EnumForeignKeys()

Me esperaba una propiedad en lugar de una función. Estoy bastante seguro detrás de las escenas que hace lo que cmsjr sugirió.

+0

Mi lectura de MSDN es que hace lo que yo quiero (habiendo sólo se veía, después de haber dejado de notar esta adición!) – Murph

2

podría utilizar el INFORMATION_SCHEMA Vistas.

INFORMATION_SCHEMA.TABLE_CONSTRAINTS le dará los nombres de las teclas principales de esa tabla.

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = @TableName

Teniendo en cuenta los nombres de clave principal, usted puede obtener las restricciones de referencia que utilizan las claves de INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS

Y a continuación, los nombres de las tablas mediante la consulta INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE

No SMO como tal, pero dada la arriba, debería poder armar una consulta que enumerará las restricciones que necesita desactivar.

4

Usando SMO, usted puede hacer esto:

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

Esta consulta debería funcionar, y podría ser ejecutado utilizando 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' 

por ejemplo,

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

No funciona para mí.

considerar las siguientes relaciones:

Tabla 1 -> tabla maestra; Tabla2 -> tabla esclava;

Table2.Table1_ID es una clave externa de Table1.ID

Table1.EnumForeignKeys() devuelto nulo.

En su lugar, intenté con éxito el objeto DependencyWalker. El siguiente código enumera todas las tablas que dependen de una colección determinada de tablas.

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

donde "urnas" es una colección de table.Urn.

1

Tendrás que viajar a través del árbol de dependencias. A continuación se muestra el script que usa SMO para generar la tabla Crear e insertar 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); 
        } 
      }** 

**

Cuestiones relacionadas