2013-02-26 109 views
0

給定一組對象(表,視圖,特效...)我想要刪除所有對象以及依賴它們的所有對象SQL Server SMO:刪除具有依賴關係的多個對象

這需要執行依賴關係順序中的放置操作,這兩個對象都是要刪除的對象以及所有相關對象。

這怎麼能用SQL Server管理對象(SMO) for .NET在乾淨優雅的方式?

(問題背景:要刪除的對象的集合以編程方式生成並且不可預測,我正在構建一個內部工具。)。

+0

事先警告:它*是*可能有一個依賴循環SQL Server數據庫。 – RBarryYoung 2013-02-26 22:10:34

回答

4

我將調查DependencyWalker SMO類 - http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.dependencywalker_members(v=sql.90).aspx

基本上你創建其中的一個,叫DiscoverDependencies()與甕/ SqlSmoObjects的列表,並獲得DependencyTree回來。然後,您可以將此DependencyTree對象傳遞給DependencyWalker對象上的WalkDependencies()方法,並獲取一個線性依賴列表,您可以根據該列表執行所需操作。

這裏是一個草圖怎樣的方法來刪除正在由他們引用可能看起來像表,包括一切的任意一組:

using (var conn = TestConnection.OpenSqlConnectionForTest()) 
{ 
    var db = SmoHelpersTest.GetDatabaseSmoObject(conn); 

    var smoTables = (from Table t in db.Tables 
         where t.Name.EndsWith("-XXX") 
         select t).ToList(); 

    var dependencyWalker = new DependencyWalker(db.Parent); 
    var dependencyTree = dependencyWalker.DiscoverDependencies(smoTables.Cast<SqlSmoObject>().ToArray(), DependencyType.Parents); 
    var dependencyCollection = dependencyWalker.WalkDependencies(dependencyTree); 

    foreach (DependencyCollectionNode dependencyCollectionNode in dependencyCollection.Reverse()) 
    { 
     Console.WriteLine(dependencyCollectionNode.Urn); 
     var smoObject = db.Parent.GetSmoObject(dependencyCollectionNode.Urn); 
     ((dynamic)smoObject).Drop(); 
    } 
}