Подтвердить что ты не робот

Как удалить список таблиц SQL Server, игнорируя ограничения?

У меня есть список из полдюжины таблиц MSSQL 2008, которые я бы сразу удалил из своей базы данных. Данные были полностью перенесены в новые таблицы. В новых таблицах нет ссылок на старые таблицы.

Проблема состоит в том, что старые таблицы содержат множество внутренних ограничений FK, которые были созданы автогенератором (фактически aspnet_regsql). Следовательно, сброс вручную всех ограничений - настоящая боль.

Как я могу отказаться от старых таблиц, игнорируя все внутренние ограничения?

4b9b3361

Ответ 1

Это зависит от того, как вы хотите удалить таблицы. Если список таблиц должен отбрасывать почти 20% таблиц под вашей БД.

Затем я отключу все ограничения в этом БД под моим script и отбросьте таблицы и включим ограничения под тем же самым script.

--To Disable a Constraint at DB level

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'

--Write the code to DROP tables

DROP TABLE TABLENAME

DROP TABLE TABLENAME

DROP TABLE TABLENAME

--To Enable a Constraint at DB level

EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'

Наконец, чтобы проверить статус ваших ограничений, запустите этот запрос.

--Checks the Status of Constraints

SELECT (CASE 
    WHEN OBJECTPROPERTY(CONSTID, 'CNSTISDISABLED') = 0 THEN 'ENABLED'
    ELSE 'DISABLED'
    END) AS STATUS,
    OBJECT_NAME(CONSTID) AS CONSTRAINT_NAME,
    OBJECT_NAME(FKEYID) AS TABLE_NAME,
    COL_NAME(FKEYID, FKEY) AS COLUMN_NAME,
    OBJECT_NAME(RKEYID) AS REFERENCED_TABLE_NAME,
    COL_NAME(RKEYID, RKEY) AS REFERENCED_COLUMN_NAME
FROM SYSFOREIGNKEYS
ORDER BY TABLE_NAME, CONSTRAINT_NAME,REFERENCED_TABLE_NAME, KEYNO

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

Шаг1: проверьте ограничения, связанные с таблицами.

SELECT * 
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('dbo.Tablename')

Шаг 2: Отключите ограничения, связанные с этими таблицами.

ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint

Шаг 3: Отбросьте таблицы

DROP TABLE TABLENAME

Ответ 2

Простой DROP TABLE dbo.MyTable будет игнорировать все ограничения (и триггеры), кроме внешних ключей (если вы сначала не отбросите дочернюю/ссылочную таблицу) где вам, возможно, придется отказаться от них в первую очередь.

Изменить: после комментария:

Нет автоматического пути. Вам придется перебирать sys.foreign_keys и генерировать некоторые инструкции ALTER TABLE.

Ответ 3

Я нашел разумный (ish) способ сделать это, заставив SQL написать SQL, чтобы удалить ограничения:

select concat("alter table ", table_name, " drop ", constraint_type ," ", constraint_name, ";")
  from information_schema.table_constraints 
  where table_name like 'somefoo_%' 
        and 
        constraint_type <> "PRIMARY KEY";

Вы хотите изменить имя таблицы в соответствии с вашими потребностями или, возможно, выбрать другой столбец/значения.

Кроме того, это будет выбирать любое ограничение не первичного ключа, которое может быть слишком большим для кувалды. Может быть, вам нужно просто установить его на =?

Я не администратор базы данных. могут быть лучшие способы сделать это, но он работал достаточно хорошо для моих целей.

Ответ 4

Запустите следующий script, чтобы удалить все ограничения во всех таблицах в текущей базе данных, а затем запустите инструкции таблицы рассылки.

DECLARE @dropAllConstraints NVARCHAR(MAX) = N'';

SELECT @dropAllConstraints  += N'
ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id))
    + '.' + QUOTENAME(OBJECT_NAME(parent_object_id)) + 
    ' DROP CONSTRAINT ' + QUOTENAME(name) + ';'
FROM sys.foreign_keys;
EXEC sp_executesql @dropAllConstraints 

Ответ 5

Наконец, я нашел решение на основе script, предоставленного Джейсоном Пресли. Этот script автоматически удаляет все ограничения в БД. Легко добавить предложение WHERE, чтобы оно применимо только к набору соответствующих таблиц. После этого отбрасывание всех таблиц является простым.

Ответ 6

Я подозреваю, что вам нужно будет сделать команду "alter" на таблицах с нарушениями перед тем, как вы уберете, чтобы удалить ограничения forigen.

ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders;
DROP TABLE Orders;

Конечно, если вы сначала отбросите дочерние таблицы, тогда у вас не будет этой проблемы. (если у вас нет ограничения таблицы A для таблицы B и ограничения таблицы B на A, тогда вам нужно будет изменить одну из таблиц, например A, чтобы удалить ограничение)

например. этот WONT работает, поскольку у ордеров есть ограничение от Order_Lines

DROP TABLE Orders;
DROP TABLE Order_lines;

например. это будет работать

DROP TABLE Order_lines;
DROP TABLE Orders;