2012-06-24 28 views
1

我一直在用我的新MVC應用程序進行大量測試,現在我已準備好進入新的開發階段。如何從aspnet架構中截斷所有表?

我想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

+0

你多久做一次這樣的事情,你用'TRUNCATE'獲得的積蓄會在任何事情上真正扮演重要角色? –

+0

微不足道。但是這是我想要做的和不可能的,然後無法弄清楚或找到「爲什麼」的答案,並提出一個問題來學習。 :) – mawburn

+0

您的'DELETE'是否仍然需要按照定義的順序處理表格(無論您是否將其限制爲單個用戶)?即使排除了所有「WHERE」子句(似乎愚蠢地循環遍歷所有用戶併爲每個用戶運行5次刪除),您在網上找到的訂單也將起作用。 –

回答

3

您不能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值。