какой самый простой способ динамически/программно удалять таблицы последовательно на основе их зависимостей?

avatar
user9393635
8 апреля 2018 в 04:10
85
1
0

Мне нужно динамически/программно удалить набор таблиц в базе данных. Это нужно будет делать последовательно, чтобы избежать ошибок ограничения. Например, таблицу UserRole необходимо удалить перед таблицей User. Я уверен, что это можно сделать, но я не уверен, как проще всего это сделать.

Источник
Nick.McDermaid
8 апреля 2018 в 04:52
0

В Visual Studio есть "сравнение схем" - я думаю, что это работает для вас

user9393635
8 апреля 2018 в 05:03
0

@juergen - не уверен, почему мой дизайн таблицы будет неправильным, он использует стандартные fk

user9393635
8 апреля 2018 в 05:03
0

@nick Я не думаю, что сравнение схем будет динамически генерировать сценарии для меня.

Zohar Peled
8 апреля 2018 в 07:29
0

Ну, что вы пробовали до сих пор? Вы читали этот пост SO?

Ответы (1)

avatar
Hadi Ardebili
8 апреля 2018 в 05:27
1

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

  DECLARE @Statement VARCHAR(300);
  DECLARE @TableName VARCHAR(300) = 'del';
  DECLARE @Schema VARCHAR(300) = 'dbo';
  DECLARE @DelStatement nvarchar (100);

  -- Cursor to generate ALTER TABLE DROP CONSTRAINT statements  
  DECLARE cur CURSOR FOR
  SELECT 'ALTER TABLE ' + OBJECT_SCHEMA_NAME(parent_object_id) + '.' + 
  OBJECT_NAME(parent_object_id) +
                ' DROP CONSTRAINT ' + name
  FROM sys.foreign_keys 
  WHERE OBJECT_SCHEMA_NAME(referenced_object_id) = @Schema AND 
            OBJECT_NAME(referenced_object_id) = @TableName;

  OPEN cur;
  FETCH cur INTO @Statement;

  -- Drop each found foreign key constraint 
  WHILE @@FETCH_STATUS = 0
  BEGIN
   exec(@Statement);
   FETCH cur INTO @Statement;
 END

 CLOSE cur;
 DEALLOCATE cur;
 -- Drop the table
SET @DelStatement = 'drop table '+@Schema+'.'+@TableName
exec(@DelStatement)

Если у вас есть список таблиц, которые вы хотите удалить, вы можете поместить его в другой курсор, и он будет выполняться для каждой таблицы.

HABO
8 апреля 2018 в 13:01
0

Совет. При сборке имен объектов в динамические операторы SQL рекомендуется использовать QuoteName(), чтобы избежать проблем с нечетными именами, например New Table с пробелом или зарезервированными словами, такими как From.