Удаление таблицы со всеми ее зависимостями (Microsoft SQL Server) - PullRequest
14 голосов
/ 22 апреля 2011

Как я могу удалить таблицу со всеми ее зависимостями [SP, Views и т. Д.] (Microsoft SQL Server), не зная заранее ее зависимости?Я знаю, что могу отобразить все зависимости в Mangement Studio, но я ищу служебный скрипт, который бы мог просто указать объект, и он отбросил бы этот объект со всеми его зависимостями.

Ответы [ 3 ]

25 голосов
/ 23 апреля 2011

Лучше всего это сделать «Создать сценарии для удаления»

Выбор базы данных -> Щелкните правой кнопкой мыши -> Задачи -> Создать сценарии - откроет мастер для создания сценариев

  • Выберите базу данных -> далее
  • Установите для параметра «Сценарий для создания» значение true (хотите создать)
  • Установите для параметра «Сценарий для удаления» значение true (хотите удалить)
  • Установите для параметра «Создать сценарий для зависимого объекта» значение true -> Далее
  • Установите флажок, чтобы выбрать объекты, для которых требуется создать сценарий
  • Выберите параметр для записи сценария (Файл, Новыйокно, буфер обмена)

Выполнить сценарий

Таким образом, мы можем настроить наш сценарий, т. е. выполнить сценарии для выбранных объектов базы данных.

Я надеюсьэто вам поможет!

С наилучшими пожеланиями, JP

2 голосов
/ 22 апреля 2011

Вы можете использовать Sp_Depends, чтобы найти зависимости. С этим вы можете изменить сценарий из этого ответа Может быть, кто-то менее ленивый, чем я, сделает это для вас.

Примечание. Каждый объект, конечно, может иметь свои собственные зависимости, поэтому вам также придется обрабатывать их.

1 голос
/ 27 июня 2013

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

create procedure [dbo].[spDropObject] (@fullname nvarchar(520))
as
begin
    begin try
        declare @type nvarchar(5)
        declare @resolvedFullname nvarchar(520) 
        declare @resolvedName nvarchar(255) 
        set @type = null
        set @resolvedFullname = null
        set @resolvedName = null

        --find the object
        select 
        @type = o.[type] 
        ,@resolvedFullname = '[' + object_schema_name(o.id) +  '].[' + o.[name] + ']'
        ,@resolvedName = '[' + o.[name] + ']'
        from dbo.sysobjects o
        where id = object_id(@fullname)

        --PROCEDURE
        if(@type = 'P') 
        begin
            exec('drop procedure ' + @resolvedFullname);
            return;
        end

        --VIEW
        if(@type = 'V') 
        begin
            exec('drop view ' + @resolvedFullname);
            return;
        end

        --FUNCTION
        if(@type = 'FN' or @type = 'TF') 
        begin
            exec('drop function ' + @resolvedFullname);
            return;
        end

        --TRIGGER
        if(@type = 'TF') 
        begin
            exec('drop trigger ' + @resolvedFullname);
            return;
        end

        --CONSTRAINT
        if(@type = 'C' or @type = 'UQ' or @type = 'D' or @type = 'F' or @type = 'PK' or @type = 'K') 
        begin
            declare @fullTablename nvarchar(520);
            set @fullTablename = null

            --find the contraint's table
            select @fullTablename ='[' + object_schema_name(t.[object_id]) + '].[' + t.[Name] + ']'
            from sys.tables t
            join sys.schemas s on t.schema_id = s.schema_id
            where t.object_id = (select parent_obj from dbo.sysobjects where id = object_id(@resolvedFullname))

            exec('alter table ' + @fullTablename + ' drop constraint ' + @resolvedName);
            return; 
        end

        --TABLE (drop all constraints then drop the table)
        if(@type = 'U') 
        begin
            --find FK references to the table
            declare @fktab table([Name] nvarchar(255))
            insert @fktab 
            select 
            [Name] = '[' + object_name(fkc.[constraint_object_id]) + ']'
            /*
            ,[Parent] = '[' + object_schema_name(fkc.[parent_object_id]) +  '].[' + object_name(fkc.[parent_object_id]) + ']'
            ,[Ref] = '[' + object_schema_name(fkc.[referenced_object_id]) +  '].[' + object_name(fkc.[referenced_object_id]) + ']'
            */
            from sys.foreign_key_columns as fkc
            where referenced_object_id = object_id(@resolvedFullname)
            order by [Name]

            --iterate FKs
            while(1=1)
            begin
                declare @constraint nvarchar(255)
                set @constraint = null
                select top 1
                @constraint = [Name]
                from @fktab

                if(@constraint is not null)
                begin
                    --drop FK constraint
                    exec [dbo].[spDropObject] @constraint;
                    delete from @fktab where [Name] = @constraint --remove current record from working table
                end
                else break;
            end         

            --find constraints for table
            declare @constraintTab table ([Name] nvarchar(255));

            insert @constraintTab
            select [name] 
            from sys.objects 
            where parent_object_id = object_id(@resolvedFullname)
            order by [name]

            --iterate constraints
            while(1=1)
            begin
                set @constraint = null;
                select top 1 @constraint = [Name] from @constraintTab

                if(@constraint is not null)
                begin
                    --drop constraint
                    exec [dbo].[spDropObject] @constraint;
                    delete from @constraintTab where [Name] = @constraint --remove current record from working table
                end
                else break;
            end

            --drop table
            exec('drop table ' + @resolvedFullname);
            return;
        end
    end try
    begin catch
        declare @message nvarchar(max)
        set @message = error_message( ) ;
        print @message
    end catch
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...