1

私は新しい MVC アプリで多くのテストを行ってきましたが、今では開発の新しい段階に進む準備ができています。

TRUNCATEaspnet で生成されたテーブルをすべて削除したいのですが、すべての外部キー制約を削除する順序がわかりません。

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、目標がIDENTITY値を 1 で再起動することでもある場合)。

于 2012-06-24T17:47:33.893 に答える