给定一组对象(表、视图、过程...),我想删除所有这些对象以及依赖它们的所有对象。
这需要以依赖顺序对我想要删除的对象以及所有依赖对象执行删除操作。
如何以干净优雅的方式使用适用于 .NET 的SQL Server 管理对象 (SMO)来完成这项工作?
(问题背景:要删除的对象集是以编程方式生成的,不可预测。我正在构建一个内部工具。)。
给定一组对象(表、视图、过程...),我想删除所有这些对象以及依赖它们的所有对象。
这需要以依赖顺序对我想要删除的对象以及所有依赖对象执行删除操作。
如何以干净优雅的方式使用适用于 .NET 的SQL Server 管理对象 (SMO)来完成这项工作?
(问题背景:要删除的对象集是以编程方式生成的,不可预测。我正在构建一个内部工具。)。
我会研究DependencyWalker
SMO 类 - http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.dependencywalker_members(v=sql.90).aspx
基本上,您创建其中一个,DiscoverDependencies()
使用 Urns/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();
}
}