2009-04-19 34 views
5

Tôi cần thay đổi một số khóa chính từ không được nhóm thành nhóm nhưng tôi không thể bỏ ràng buộc vì nó được tham chiếu từ các khóa ngoài khác.SQL 2005 SMO - tìm tham khảo bảng

Làm cách nào để tìm các bảng tham chiếu khóa chính trong bảng chính như một phần của quan hệ nước ngoài mà không lặp qua tất cả các bảng trong DB? Tôi cần phải vô hiệu hóa các ràng buộc trên, thay đổi PK và kích hoạt lại.

Cập nhật:

  1. Tôi không muốn sử dụng SQL đơn giản để làm điều này nhưng chỉ SMO.

  2. Marc, tôi biết về ForeignKeys bởi tôi cần một cái gì đó như: table.PrimaryKey.ForeignKeys (tức mà bảng đang tham chiếu khóa chính bảng của tôi) Tôi chỉ muốn tránh lặp qua tất cả các bảng trong cơ sở dữ liệu và kiểm tra các ForeignKeys tài sản trên mỗi một trong số họ để xem ai trong số họ tham khảo bàn của tôi. (không thể mở rộng)

Trả lời

5

Ok tôi nghĩ mình đã tìm thấy nó.

table.Columns[0].EnumForeignKeys() 

hoặc trực tiếp

table.EnumForeignKeys()

tôi đã mong đợi một tài sản thay vì một hàm. Tôi khá chắc chắn đằng sau hậu trường nó làm những gì cmsjr đề nghị.

+0

đọc của tôi về MSDN là nó làm những gì yo muốn (khi chỉ nhìn, sau khi thất bại trong việc nhận bổ sung này!) – Murph

2

Bạn có thể sử dụng INFORMATION_SCHEMA xem.

INFORMATION_SCHEMA.TABLE_CONSTRAINTS sẽ cung cấp cho bạn tên của các khóa chính trên bảng đó.

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = @TableName

Với tên khóa chính bạn có thể nhận được ràng buộc tham chiếu sử dụng những chìa khóa từ INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS

Và sau đó các tên bảng bằng cách truy vấn INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE

Không SMO như vậy, nhưng với các ở trên bạn sẽ có thể đặt cùng một truy vấn sẽ liệt kê các ràng buộc bạn cần phải vô hiệu hóa.

4

Sử dụng SMO, bạn có thể làm điều này:

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

Truy vấn này nên làm việc, và có thể được thực hiện bằng 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' 

ví dụ

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

Nó không hiệu quả với tôi.

Xem xét các mối quan hệ sau:

Bảng1 -> bảng chính; Bảng 2 -> bảng phụ;

Table2.Table1_ID là khóa ngoại của Table1.ID

Table1.EnumForeignKeys() return null.

Thay vào đó, tôi đã thử với thành công đối tượng DependencyWalker. Mã sau đây liệt kê tất cả các bảng mà nhúng từ một bộ sưu tập các bảng nhất định.

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

trong đó "urns" là tập hợp bảng.Un.

1

Bạn sẽ phải di chuyển qua cây phụ thuộc. Sau đây là tập lệnh sử dụng SMO để tạo bảng Tạo và chèn tập lệnh.

**

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

**

Các vấn đề liên quan