2011-10-27 22 views
2

私は膨大な文書化された制約がたくさんある膨大なデータベースを持っています。 これらのテーブルのサブセットからデータを空にするためにSQLを書く必要があり、削除の順序を決定する方法がわかりません。当然のことながら、対応するPKテーブルの前にFKテーブルを削除する必要がありますが、関係が絡み合っていて、文書化されていないと言います。削除の順序を計算するSQL Server

私の削除ステートメントの正しい順序を決定するツールがありますか?

(私はレッドゲートのツールを見て、彼らは私が使っているものですSQL Serverの2008R2をサポートしていません見つけることが絶対に驚きました。)

+0

こんにちはフレッド。私はSQL Compareのプロダクトマネージャーです。 SQL Server 2008 R2をサポートしています。過去にこれに問題があった場合、それ以降解決されたバグを見つけた可能性があります。これをもう一度やり直すことができますか?問題がある場合は、red-gate dot comのDavid dot Atkinsonに直接メールしてください。 –

+0

デビッド、ごめんなさい、私があなたの製品を嫌っているのですが、上記のことを言っているあなたの販売員からのメールがあります(彼はあなたが数ヶ月でそれをサポートしてくれると言っていました)また、「バージョンがサポートされていません」というメッセージを表示してデータベースを開くことができませんでした。上記の質問をするツールの試用版へのリンクがありますか? –

+0

削除を実行するための1つの「注文」はないかもしれません。循環参照がある場合(自己参照、またはより大きなサイクルのいずれか)、サイクルを最初に中断する必要があります。 –

答えて

0

私はあなたの順序を得るための手順を構築することができると思います。ここにアイディアがあります:

CREATE PROCEDURE get_delete_order 
    @tablename varchar(MAX) 
as 

BEGIN 
    -- Get directed related tables 
    SELECT base.name base_name 
     , related.name rel_name 
     into #RELATED_TABLES 
     FROM sys.sysobjects base 
     left join sys.sysforeignkeys on fkeyid = base.id 
     left join sys.sysobjects related on related.id = rkeyid 
             and related.id <> base.id 
             and related.xtype = 'U' 
    WHERE base.xtype = 'U' 
     and base.name = @tablename 

    -- Get indirected related tables using recursive call 
    CREATE #ALL_RELATED_TABLES (rel_name varchar(max), del_order int) 
    INSERT INTO #ALL_RELATED_TABLES (rel_name, del_order) 
     SELECT rel_name 
      , -1 
      FROM #RELATED_TABLES 

    DECLARE @relate_table 
    DECLARE IND_REL CURSOR FOR 
     SELECT rel_Name 
      FROM #RELATED_TABLES 
    open IND_REL 
    fetch next from IND_REL into @relate_table 

    -- TODO: IMPORTANT!!! Avoid infinite loop here 
    while (@@FETCH_STATUS = 0) 
    begin 
     INSERT INTO #ALL_RELATED_TABLES (rel_name, del_order) 
      exec get_delete_order(@relate_table) 
     fetch next from IND_REL into @relate_table 
    end 
    close IND_REL 
    deallocate IND_REL 

    -- Return resultset 
     SELECT rel_name 
      , del_order + 1 
     FROM #ALL_RELATED_TABLES 
    ORDER BY del_order DESC 
END 

これはテストされていません。 実際の手順はもっと複雑になります:)

+0

これは、データの取得に役立ちました私はExcelで手で操作しました。将来の読者のために、このURLでスクリプトをチェックアウトすることもできます:http://bytestopshere.wordpress.com/2008/11/01/sql-server-script-to-find-foreign-key-dependencies/あなたの助けをありがとう。 –