给定一组对象(表,视图,特效...)我想要删除所有对象以及依赖它们的所有对象。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