2010-01-26 76 views
0

有没有办法用约束条件截断表?带约束条件的截断表

我想这个停用:

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 

当然,它并没有奏效。我必须删除约束然后重新创建它们!我可以使它工作的唯一方法是通过提取脚本来删除并重新创建这个约束。

还有别的办法吗?顺便说一句,我不想​​删除,因为它会使用事务日志。

回答

1

这是一个脚本,可以帮助您开始编写FK的脚本。 Script out your foreign keys

我使用修改后的版本将约束定义转储到临时表中,然后执行TRUNCATE魔术,然后从临时表中重新创建约束。但是,这只是为了方便我将生产数据库恢复到非生产环境以摆脱大部分数据。不知道,我会在生产场景中使用它。我宁愿选择小批量删除,因为它知道所有内容都已完全记录。

顺便说一句,子宫对SQL Server 2000联机丛书的引用有点令人误解。 TRUNCATE TABLE一直是一个最小化日志操作。

TRUNCATE TABLE通过释放用于存储表数据的数据页来删除数据,并且只有页解除分配被记录在事务日志中。

这在更高版本的联机丛书中有更详细的说明。

+0

谢谢!这正是我期待的!一种提取alter脚本的方法。我现在不能投票,但我会投票给你! – PollusB 2010-01-28 18:17:59

0

你自己回答了这个问题 - 如果有一个外键引用你的表,SQL Server需要在事务日志中记录这些信息。由于TRUNCATE TABLE有效绕过日志,因此不允许在由外键引用的表上。

您将不得不外键约束,或使用DELETE语句。

0

它只是引用(例如REFERENCES位)您需要删除的外键。

这应该更容易...

1

将truncate命令将不会与FK引用的表工作。直接从documentation

不能由一个外键约束 引用的 表使用TRUNCATE TABLE;相反,使用不带WHERE子句的DELETE 语句。 由于未记录TRUNCATE TABLE,因此无法激活触发器。