2010-09-20 52 views
7

在SQL Server 2008中是否有查詢將刪除所有從屬表中的數據以及所選表?刪除從屬表中的數據

我對沒有詳細闡述這個問題深表歉意。我知道級聯刪除工作正常,但我的應用程序連接到第三方SQL Server數據庫。我有幾個單元測試插入目標表和從屬表。不幸的是,目標表上的約束不是在刪除級聯,我不能創建它們或創建它們。我正在尋找遍歷依賴關係的通用方法,並以正確的順序刪除數據。

+2

如果您具有帶級聯刪除規則的完整性約束(外鍵),則不必擔心。 http://publib.boulder.ibm.com/infocenter/idshelp/v10/topic/com.ibm.sqls.doc/sqls292.htm – AlexanderMP 2010-09-20 11:03:12

+1

儘管鏈接是用於informix文檔,但對於sql server也是如此。 – Giorgi 2010-09-20 11:05:28

+0

如果至少有外鍵已定義(沒有級聯刪除),則可以使用系統表創建動態SQL,實際上與級聯刪除相同。如果沒有定義外鍵,那麼爲它制定通用解決方案几乎沒有希望。 – 2010-09-20 14:18:50

回答

7

由於有外鍵關係,下面的腳本可以讓你開始模仿級聯刪除。

DECLARE @TableName VARCHAR(32) 
DECLARE @PrimaryKey VARCHAR(32) 

SET @TableName = 'MasterTable' 
SET @PrimaryKey = '1' 

SELECT 'DELETE FROM ' 
     + fks.name + '.' + fkt.name 
     + ' WHERE ' 
     + pc.name 
     + ' = ' 
     + @PrimaryKey 
     , fko.name as [FK Name] 
     , fk.constraint_column_id as [Col Order] 
     , fks.name + '.' + fkt.name as [FK table] 
     , pc.name as [FK column] 
     , rcs.name + '.' + rct.name as [PK table] 
     , rc.name as [PK column] 
FROM sys.foreign_key_columns fk 
     -- FK columns 
     INNER JOIN sys.columns pc ON fk.parent_object_id = pc.object_id 
            AND fk.parent_column_id = pc.column_id 
     INNER JOIN sys.objects fkt ON pc.object_id = fkt.object_id 
     INNER JOIN sys.schemas as fks ON fks.schema_id = fkt.schema_id 
     -- referenced PK columns 
     INNER JOIN sys.columns rc ON fk.referenced_object_id = rc.object_id 
            AND fk.referenced_column_id = rc.column_id 
     INNER JOIN sys.objects rct ON rc.object_id = rct.object_id 
     INNER JOIN sys.schemas as rcs ON rcs.schema_id = rct.schema_id 
     -- foreign key constraint name 
     INNER JOIN sys.objects fko ON fk.constraint_object_id = fko.object_id 
WHERE rct.Name = @TableName 
2

要做到這一點,你有級聯刪除設置表之間的約束。你可以做一個圖中通過拖動字段之間的連接和編輯的屬性,或使用查詢:

alter table SomeTable 
add constraint SomeConstraint 
foreign key (SomeField) references SomeOtherTable (SomeOtherField) 
on delete cascade