1

我一直在用我的新 MVC 应用程序进行大量测试,现在我已准备好进入新的开发阶段。

我想要TRUNCATE我所有的 aspnet 生成的表,但我似乎无法弄清楚删除所有外键约束的顺序。

TRUNCATE TABLE  aspnet_Profile 
TRUNCATE TABLE  aspnet_UsersInRoles 
TRUNCATE TABLE  aspnet_PersonalizationPerUser
TRUNCATE TABLE  aspnet_Membership
TRUNCATE TABLE  aspnet_users 

在这一点上,我在 aspnet_Users 上遇到了一个外键约束问题。查看图表,我似乎找不到更多引用 aspnet_users 的内容。

我实际上是从我在网上找到的删除语句中提取了这个命令,该语句在逐个用户中运行良好。

DECLARE @UserId uniqueidentifier
SET @UserId = 'f0a05439-5218-4668-b11d-21a43385ea2f'

DELETE FROM aspnet_Profile WHERE UserID = @UserId
DELETE FROM aspnet_UsersInRoles WHERE UserID = @UserId
DELETE FROM aspnet_PersonalizationPerUser WHERE UserID = @UserId
DELETE FROM dbo.aspnet_Membership WHERE UserID = @UserId
DELETE FROM aspnet_users WHERE UserID = @UserId

其中,我可能可以重新工作以删除所有用户,但我更愿意TRUNCATE.

4

1 回答 1

4

您不能TRUNCATE使用外键引用它的表。即使两个表都是空的,即使您禁用了外键约束。

假设您有再次生成约束的脚本,您可以从引用表中删除外键,例如:

SELECT '
  ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(fk.parent_object_id))
   + '.' + QUOTENAME(OBJECT_NAME(fk.parent_object_id))
   + ' DROP CONSTRAINT ' + QUOTENAME(fk.name) + ';'
FROM sys.foreign_keys AS fk
INNER JOIN sys.tables AS t
ON fk.referenced_object_id = t.[object_id]
WHERE t.name LIKE 'aspnet[_]%';

SELECT 'TRUNCATE TABLE ' + QUOTENAME(name) + ';'
  FROM sys.tables 
  WHERE name LIKE 'aspnet[_]%';

否则,仅使用DELETE而不是可能更安全TRUNCATE(然后DBCC CHECKIDENT,如果您的目标是在 1 处重新启动任何IDENTITY值)。

于 2012-06-24T17:47:33.893 回答