Asp.net mvc 如何从aspnet模式截断所有表?
我已经用我的新MVC应用程序做了很多测试,现在我准备进入一个新的开发阶段 我想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
截断所有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次删除似乎很愚蠢)。