給定一組對象(表,視圖,特效...)我想要刪除所有對象以及依賴它們的所有對象。SQL Server SMO:刪除具有依賴關係的多個對象
這需要執行依賴關係順序中的放置操作,這兩個對象都是要刪除的對象以及所有相關對象。
這怎麼能用SQL Server管理對象(SMO) for .NET在乾淨優雅的方式?
(問題背景:要刪除的對象的集合以編程方式生成並且不可預測,我正在構建一個內部工具。)。
給定一組對象(表,視圖,特效...)我想要刪除所有對象以及依賴它們的所有對象。SQL Server SMO:刪除具有依賴關係的多個對象
這需要執行依賴關係順序中的放置操作,這兩個對象都是要刪除的對象以及所有相關對象。
這怎麼能用SQL Server管理對象(SMO) for .NET在乾淨優雅的方式?
(問題背景:要刪除的對象的集合以編程方式生成並且不可預測,我正在構建一個內部工具。)。
我將調查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();
}
}
事先警告:它*是*可能有一個依賴循環SQL Server數據庫。 – RBarryYoung 2013-02-26 22:10:34