2013-02-26 65 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(); 
    } 
}