2017-05-19 80 views
1

我想在sql 中寫一個刪除觸發器,實際上我有兩個表「products」和「productdetail」,並使用產品主鍵作爲productdetail中的外鍵。產品細節可以包含針對單個產品對象的多個記錄。如何在sql server中實現刪除觸發器

現在我想要做這樣的 如果我刪除一個記錄說:「有主鍵1」,在產品表,那麼所有其他具有外鍵「1」,在產品詳情表自動刪除

我從來沒有使用記錄在此之前觸發。這意味着我不熟悉它搜索的語法,並閱讀不同的文章,但無法理解。請給我它的完整解決方案,即其完整的語法

+1

在這種情況下,你應該使用刪除級聯。你可以在這裏看到答案。 http://stackoverflow.com/questions/6260688/how-do-i-use-cascade-delete-with-sql-server –

+1

FWIW:我更喜歡使用存儲過程(SP)來處理這類事情。用戶不需要直接訪問表格,只需要SP。可以實施其他業務規則。它將實現分離成可測試的部分並隱藏細節,例如如果您決定只設置一個「Obsolete」位而不是刪除行。臨時查詢中的一個愚蠢的錯誤將不會無意中級聯。 ... – HABO

回答

2

在這種情況下,您應該使用刪除級聯。

alter table ProductDetail 
add constraint fk_product foreign key (productID) 
references Product (productID) 
on delete cascade; 

但如果你真的想在刪除使用觸發器,它是這樣的:

create trigger sampleTriggerName on dbo.Product 
for delete 
as 
delete 
from dbo.ProductDetail 
where productID in (
     select deleted.id 
     from deleted 
     ) 
go 
+0

感謝您真正提供他所需要的和他要求的東西! – Mardoxx

+0

只是儘可能地幫助。你也是。 –

1

全部工作示例:

IF OBJECT_ID('[dbo].[DataSourceParent]') IS NOT NULL 
BEGIN; 
    DROP TABLE [dbo].[DataSourceParent]; 
END; 

CREATE TABLE [dbo].[DataSourceParent] 
(
    [ParentID] TINYINT 
); 

GO 

IF OBJECT_ID('[dbo].[DataSourceChild]') IS NOT NULL 
BEGIN; 
    DROP TABLE [dbo].[DataSourceChild]; 
END; 

CREATE TABLE [dbo].[DataSourceChild] 
(
    [ChildID] TINYINT 
    ,[ParentID] TINYINT 
); 

GO 


CREATE TRIGGER trg_DataSourceParent_A_D ON [dbo].[DataSourceParent] AFTER DELETE 
AS 
BEGIN; 

    DELETE [dbo].[DataSourceChild] 
    FROM [dbo].[DataSourceChild] DC 
    INNER JOIN deleted D 
     ON DC.[ParentID] = D.[ParentID]; 

END; 

GO 

INSERT INTO [dbo].[DataSourceParent] ([ParentID]) 
VALUES (1) 
     ,(2) 
     ,(3); 

INSERT INTO [dbo].[DataSourceChild] ([ParentID], [ChildID]) 
VALUES (1, 10) 
     ,(2, 20) 
     ,(2, 30) 
     ,(3, 20); 

DELETE FROM [dbo].[DataSourceParent] 
WHERE [ParentID] = 2; 

SELECT * 
FROM [dbo].[DataSourceParent]; 

SELECT * 
FROM [dbo].[DataSourceChild] ;