【问题标题】:SQL Server SMO: drop multiple objects with dependenciesSQL Server SMO:删除具有依赖关系的多个对象
【发布时间】:2013-02-26 19:46:45
【问题描述】:

给定一组对象(表、视图、进程...),我想删除所有这些对象以及所有依赖于它们的对象

这需要以依赖顺序对我要删除的对象以及所有依赖对象执行删除操作。

如何使用 SQL Server Management Objects (SMO) for .NET 以简洁优雅的方式实现这一点?

(问题背景:要删除的对象集是以编程方式生成的,不可预测。我正在构建一个内部工具。)。

【问题讨论】:

  • 预先警告:在 SQL Server 数据库中可能存在依赖循环。

标签: .net sql-server sql-server-2012 smo


【解决方案1】:

我会研究DependencyWalker SMO 课程 - http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.dependencywalker_members(v=sql.90).aspx

基本上,您创建其中一个,使用 Urns/SqlSmoObjects 列表调用 DiscoverDependencies(),然后返回 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();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多