Asp.net mvc 如何从aspnet模式截断所有表?

Asp.net mvc 如何从aspnet模式截断所有表?,asp.net-mvc,tsql,sql-server-2008-r2,database-schema,Asp.net Mvc,Tsql,Sql Server 2008 R2,Database Schema,我已经用我的新MVC应用程序做了很多测试,现在我准备进入一个新的开发阶段 我想截断所有aspnet生成的表,但我似乎无法确定删除所有外键约束的顺序 TRUNCATE TABLE aspnet_Profile TRUNCATE TABLE aspnet_UsersInRoles TRUNCATE TABLE aspnet_PersonalizationPerUser TRUNCATE TABLE aspnet_Membership TRUNCATE TABLE aspnet_user

我已经用我的新MVC应用程序做了很多测试,现在我准备进入一个新的开发阶段

我想
截断所有aspnet生成的表,但我似乎无法确定删除所有外键约束的顺序

TRUNCATE TABLE  aspnet_Profile 
TRUNCATE TABLE  aspnet_UsersInRoles 
TRUNCATE TABLE  aspnet_PersonalizationPerUser
TRUNCATE TABLE  aspnet_Membership
TRUNCATE TABLE  aspnet_users 
在这方面,我得到了一个关于aspnet_用户的外键约束问题。查看图表,我似乎找不到更多可以引用aspnet_用户的信息

实际上,我是从我在网上找到的一条delete语句中提取这个命令的,这条语句可以很好地逐个用户地工作

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

我可能可以修改它以删除所有用户,但我更愿意
截断

您不能
截断带有外键引用的表。即使两个表都为空,即使禁用外键约束

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

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
值),可能更安全。

您不能
截断带有外键引用的表。即使两个表都为空,即使禁用外键约束

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

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
值,则可能更安全)。

您这样做的频率有多高,使用
TRUNCATE
所节省的成本在任何事情中都会起到很大作用?可以忽略不计。但这是我想做但做不到的事情,然后我就无法找出或找到“为什么”的答案,并问了一个要学习的问题。:)您的
DELETE
是否仍必须按定义的顺序处理表(无论您是否将其限制为单个用户)?即使你排除了所有的
WHERE
子句,你在网上找到的顺序也会起作用(在所有用户中循环并为每个用户运行5次删除似乎很愚蠢)。你这样做的频率有多高,你通过
TRUNCATE
节省下来的钱真的会在任何事情中起到很大作用?可以忽略不计。但这是我想做但做不到的事情,然后我就无法找出或找到“为什么”的答案,并问了一个要学习的问题。:)您的
DELETE
是否仍必须按定义的顺序处理表(无论您是否将其限制为单个用户)?即使排除了所有
WHERE
子句,您在网上找到的顺序也会起作用(在所有用户中循环并为每个用户运行5次删除似乎很愚蠢)。