0

オブジェクトのセット (テーブル、ビュー、プロシージャなど) が与えられた場合、それらすべてとそれらに依存するすべてのオブジェクトを削除したいと考えています。

これには、ドロップするオブジェクトとすべての依存オブジェクトの両方に対して、依存関係の順序でドロップ操作を実行する必要があります。

.NET 用のSQL Server 管理オブジェクト (SMO)を使用して、クリーンでエレガントな方法でこれを行うにはどうすればよいでしょうか?

(質問の背景:ドロップするオブジェクトのセットはプログラムで生成され、予測できません。私は内部ツールを構築しています。)

4

1 に答える 1

4

DependencyWalkerSMO クラスを調べます- 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();
    }
}
于 2013-02-26T20:46:26.530 に答える