我想在sql 中寫一個刪除觸發器,實際上我有兩個表「products」和「productdetail」,並使用產品主鍵作爲productdetail中的外鍵。產品細節可以包含針對單個產品對象的多個記錄。如何在sql server中實現刪除觸發器
現在我想要做這樣的 如果我刪除一個記錄說:「有主鍵1」,在產品表,那麼所有其他具有外鍵「1」,在產品詳情表自動刪除
我從來沒有使用記錄在此之前觸發。這意味着我不熟悉它搜索的語法,並閱讀不同的文章,但無法理解。請給我它的完整解決方案,即其完整的語法
我想在sql 中寫一個刪除觸發器,實際上我有兩個表「products」和「productdetail」,並使用產品主鍵作爲productdetail中的外鍵。產品細節可以包含針對單個產品對象的多個記錄。如何在sql server中實現刪除觸發器
現在我想要做這樣的 如果我刪除一個記錄說:「有主鍵1」,在產品表,那麼所有其他具有外鍵「1」,在產品詳情表自動刪除
我從來沒有使用記錄在此之前觸發。這意味着我不熟悉它搜索的語法,並閱讀不同的文章,但無法理解。請給我它的完整解決方案,即其完整的語法
在這種情況下,您應該使用刪除級聯。
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
感謝您真正提供他所需要的和他要求的東西! – Mardoxx
只是儘可能地幫助。你也是。 –
全部工作示例:
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] ;
在這種情況下,你應該使用刪除級聯。你可以在這裏看到答案。 http://stackoverflow.com/questions/6260688/how-do-i-use-cascade-delete-with-sql-server –
FWIW:我更喜歡使用存儲過程(SP)來處理這類事情。用戶不需要直接訪問表格,只需要SP。可以實施其他業務規則。它將實現分離成可測試的部分並隱藏細節,例如如果您決定只設置一個「Obsolete」位而不是刪除行。臨時查詢中的一個愚蠢的錯誤將不會無意中級聯。 ... – HABO