TRUNCATE TABLES с ОГРАНИЧЕНИЯМИ - PullRequest
0 голосов
/ 26 января 2010

Есть ли способ обрезать таблицы с ограничениями?

Я пытался отключить это:

DECLARE @SQLtxt varchar(max)
SET @SQLtxt = '-- DESACTIVER LES CONTRAINTES' + CHAR(10)
SELECT @SQLtxt = @SQLtxt + 'ALTER TABLE [' + name + '] NOCHECK CONSTRAINT ALL;' FROM sys.tables
PRINT @SQLtxt

Конечно, это не сработало. Я должен снять ограничения, а затем воссоздать их! Единственный способ заставить его работать - это извлечь скрипт, чтобы отбросить и воссоздать противоречие.

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

Ответы [ 4 ]

1 голос
/ 27 января 2010

Вот скрипт, который может помочь вам приступить к написанию сценариев для FK. Сценарий ваших внешних ключей .

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

Кстати, упоминание матки о электронной документации по SQL Server 2000 немного вводит в заблуждение. TRUNCATE TABLE всегда была минимально зарегистрированной операцией.

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

Это было указано более точно в более поздних версиях Books Online.

1 голос
/ 26 января 2010

Команда TRUNCATE не будет работать с таблицами с ссылками FK. Прямо из документации :

Вы не можете использовать TRUNCATE TABLE на таблица, на которую ссылается FOREIGN KEY ограничение; вместо этого используйте DELETE заявление без предложения WHERE. Поскольку TRUNCATE TABLE не зарегистрировано, он не может активировать триггер.

0 голосов
/ 26 января 2010

Это только ссылки (например, бит REFERENCES) на внешние ключи, которые вам нужно удалить.

Это должно облегчить ...

0 голосов
/ 26 января 2010

Вы как бы сами ответили на вопрос - если на вашу таблицу ссылается внешний ключ, эта информация требуется SQL Server в журнале транзакций. Поскольку TRUNCATE TABLE эффективно обходит журнал, он не разрешен для таблиц, на которые ссылаются внешние ключи.

Вам придется либо DROP ограничение внешнего ключа, либо использовать оператор DELETE.

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