2017-05-19 8 views
1

Ich möchte einen Lösch-Trigger in SQL schreiben eigentlich habe ich zwei Tabellen "Produkte" und "Produktdetail" und die Verwendung des Primärschlüssels von Produkten als Fremdschlüssel in Produktdetail. Das Produktdetail kann mehrere Datensätze für ein einzelnes Produktobjekt enthalten.Wie implementieren Löschen Trigger in SQL-Server

jetzt möchte ich, wie die tun, wenn ich eine Datensätze gelöscht „sagt Primärschlüssel 1 mit“ in Produkttabelle dann alle anderen Datensätze, die automatisch

gelöscht Fremdschlüssel „1“ in product Tabelle haben

ich nie verwenden davor auslösen. das bedeutet, dass ich nicht mit der syntax vertraut bin, ich habe danach gesucht und bin zu verschiedenen artikeln gegangen, die ich aber nicht verstehen kann. Bitte geben Sie mir seine vollständigen Lösungen, d. h. seine vollständige Syntax

+1

In diesem Fall sollten Sie Kaskade löschen verwenden. Sie können die Antwort hier sehen. http://stackoverflow.com/questions/6260688/how-doi-i-use-cascade-delete-with-sql-server –

+1

FWIW: Ich bevorzuge gespeicherte Prozeduren (SPs) für diese Art von Sache. Der Benutzer benötigt keinen direkten Zugriff auf die Tabellen, nur auf den SP. Zusätzliche Geschäftsregeln können implementiert werden. Es trennt die Implementierung in testbare Teile und verbirgt die Details, z. wenn Sie sich dafür entscheiden, einfach ein "Obsolete" -Bit zu setzen, statt Zeilen zu löschen. Ein dummer Fehler in einer Ad-hoc-Abfrage wird nicht fröhlich unbeabsichtigt kaskadieren. ... – HABO

Antwort

2

In diesem Fall sollten Sie löschen kaskadieren.

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

Aber wenn Sie wirklich Trigger verwenden, um auf löschen wollen, so ist es wie folgt aus:

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

Danke für die Bereitstellung, was er braucht und was er verlangte !! – Mardoxx

+0

Nur versuchen, so hilfreich wie möglich zu sein. Tnu du auch. –

1

Vollarbeitsbeispiel:

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] ;