2016-07-01 20 views
-1

多くのテーブルを持つデータベースでは、いくつかのdelete文とtruncate文が挿入されたスクリプトがあります。私は、データベース内の各テーブルに対して、deleteステートメントまたはtruncateステートメントを持っていません。スクリプトは(私は名前を変更し、長さを短くしている)、次のようになります。スクリプトを実行した後delete文またはtruncate文で定義されていない表からデータを削除する方法はありますか?

TRUNCATE table db.dbo.table1 
TRUNCATE table db.dbo.table2 
TRUNCATE table db.dbo.table3 

--cannot truncate table because it is being referenced by a FK constraint 
--TRUNCATE table db.dbo.table4 
--TRUNCATE table db.dbo.table5 
--TRUNCATE table db.dbo.table6 
--TRUNCATE table db.dbo.table7 

DELETE FROM db.dbo.table4 
DBCC CHECKIDENT ('db.dbo.table4',RESEED, 0) 
DELETE FROM db.dbo.table5 
DBCC CHECKIDENT ('db.dbo.table5',RESEED, 0) 
DELETE FROM db.dbo.table6 
DBCC CHECKIDENT ('db.dbo.table6',RESEED, 0) 
DELETE FROM db.dbo.table7 
DBCC CHECKIDENT ('db.dbo.table7',RESEED, 0) 
DELETE FROM db.dbo.table8 
DELETE FROM db.dbo.table9 
DELETE FROM db.dbo.table10 
DELETE FROM db.dbo.table11 
DELETE FROM db.dbo.table12 
DELETE FROM db.dbo.table13 
DELETE FROM db.dbo.table14 
DELETE FROM db.dbo.table15 

、私は、データがスクリプトに含まれていないテーブルから削除されていることを発見しています。

どのテーブルにデータがあるかを確認するには、SO答えがhereである次のクエリを使用しています。

SELECT 
    t.NAME AS TableName, 
    SUM(p.rows) AS [RowCount] 
FROM 
    sys.tables t 
INNER JOIN  
    sys.indexes i ON t.OBJECT_ID = i.object_id 
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id 
WHERE 
    i.index_id <= 1 
GROUP BY 
    t.NAME, i.object_id, i.index_id, i.name 
ORDER BY 
    SUM(p.rows) DESC 

私はデータベースのバックアップを持っています。次のI:スクリプト を切り詰め/削除を実行そのデータを二重にチェックするために、実際にテーブルに削除/切り捨てスクリプト

  • に含まれていない存在しません:

    1. 「テーブルデータ」クエリがデータベース
    2. 実行を復元
    3. 'テーブルデータ'クエリを実行

    私の知見は次のとおりです。削除/切り捨てスクリプトで定義されていないテーブルからデータが削除されています。

    私の質問:データベース内のすべてのテーブルではなく、複数のテーブルを削除または切り捨てる場合、削除または切り捨てステートメントで定義されていないテーブルからデータが削除されるのはどうですか?

  • 答えて

    -1

    カスケード参照整合性制約アクション値がCASCADEの外部キーがテーブルに含まれている場合、データ・ローは削除またはトランケート・ステートメントで定義されていないテーブルから削除できます。

    here次のMicrosoftドキュメントが参考になっています。

    カスケード参照整合性
    参照整合性制約をカスケード接続使用することにより、ユーザーが た既存の外部キーポイントにキーを削除または更新しようとしたときに、データベースエンジンが実行するアクション を定義することができます。次のカスケードアクションは、 と定義できます。
    ...
    CASCADEその親テーブルの行が更新または削除されたときに
    対応する行を参照 テーブルで更新または削除されます。 timestamp列が 外部キーまたは参照キーのいずれかの一部である場合、CASCADE を指定することはできません。 ON DELETE CASCADEは、INSTEAD OF DELETEトリガを持つテーブルに対して指定された にはできません。 ON UPDATE INSTEAD OF UPDATE トリガを持つテーブルでは、CASCADEを指定できません。テーブルは、データは、外部キーのカスケード参照整合性制約があると、どのようなアクション値があるから削除されている場合
    ...

    次のチェックを確認します。

    方法1: 私はhere見つかったSOの答えで提供されている次のクエリを使用しています。マイクロソフトSQL Server Management Studioの2016年にオブジェクトエクスプローラを使用して :

    SELECT name, delete_referential_action_desc 
    FROM sys.foreign_keys 
    

    方法2

    1. は、データがテーブルオブジェクト
    2. 「のキーを順に展開し
    3. から削除されていることを表に移動します'フォルダ
    4. 外部キーを右クリックし、[変更]をクリックします。
    5. 私は、テーブル、データは、Cascadeの値と参照整合性制約をカスケード接続する外部キーを持っているから削除されていることがわかっ

    右下のウィンドウペインにあるセクションでは、

  • Delete Rule値を識別します。

    さらに、これが実際の原因であるかどうかをテストしました。値をNo Actionに更新し、データベースを復元し、削除/切り捨てスクリプトを実行し、 'テーブルデータ'クエリを実行し、データが保持されていることを確認しました。

  • +1

    あなたは自分自身に答える質問をしますか? btw私はdownvotingしていません。 –

    +0

    場合によっては、トリガーによっても削除される可能性があると考えてください。 –

    関連する問題