Рассчитать порядок удалений SQL Server - PullRequest
2 голосов
/ 28 октября 2011

У меня огромная база данных, в которой есть множество плохо документированных ограничений. Мне нужно написать некоторый SQL для очистки данных из подмножества этих таблиц, и я не уверен, как определить порядок удаления. Очевидно, мне нужно удалить таблицы FK перед соответствующей таблицей PK, но, как я уже сказал, отношения запутаны и плохо документированы.

Имеется ли инструмент, который позволит мне определить правильный порядок моих операторов удаления?

(Я посмотрел на инструменты Red Gate и был совершенно удивлен, обнаружив, что они не поддерживают SQL Server 2008R2, который я использую.)

1 Ответ

0 голосов
/ 28 октября 2011

Я думаю, вы могли бы построить процедуру, чтобы получить заказ. Вот идея:

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

Это не проверено, просто идея. Реальная процедура была бы более сложной:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...