Laden...

Löschweitergaben unter SQL

Erstellt von MrMilk vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.067 Views
M
MrMilk Themenstarter:in
75 Beiträge seit 2008
vor 15 Jahren
Löschweitergaben unter SQL

verwendetes Datenbanksystem: MS SQL 2005

Hallo,

ich stehe vor folgendem Problem:

Ich habe eine m:m Beziehung mit dem Namen 'leiht' zwischen den Tabellen 'Mitarbeiter' und 'Auto'.

Nach den Regeln entsteht nun für 'leiht' eine extra Tabelle.

Angenommen es wird nun eine Zeile aus der Tabelle "Mitarbeiter" gelöscht, so sollen auch alle Einträge mit der ID des Mitarbeiters in der Tabelle "leiht" gelöscht werden.

Gibt es für so etwas eine automatische Lösung oder wird das Löschen in der Tabelle "leiht" per Hand(seperat programmierten Befehlen) vorgenommen?

Viele grüße
MM

M
166 Beiträge seit 2008
vor 15 Jahren

Erstell dir doch einen Trigger im SQL Management Studio den du die Löschung automatisch ausführen lässt wenn bestimmte Kriterien erfüllt sind....

Sowas habe ich mal in einer anderen Umgebung unter Magic + MSSQL gemacht wo mittels eines Triggers automatisch bei Datensatzänderungen ein Datensatz in eine LogTabelle geschrieben wurde ...

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[adressLog](
    [adr_logID] INT         NOT NULL IDENTITY PRIMARY KEY,
	[adr_adressid] [uniqueidentifier] ROWGUIDCOL  NOT NULL  DEFAULT (newid()),
	[adr_street] [nvarchar](250) COLLATE Latin1_General_CI_AS NULL,
	[adr_house] [nchar](10) COLLATE Latin1_General_CI_AS NULL,
	[adr_plz] [nchar](10) COLLATE Latin1_General_CI_AS NULL,
	[adr_place] [nvarchar](250) COLLATE Latin1_General_CI_AS NULL,
	[adr_countryid] [uniqueidentifier] NULL,
	[adr_active] [bit] NULL,
	[adr_created_byid] [uniqueidentifier] NULL,
	[adr_created_date] [datetime] NULL,
	[adr_modified_byid] [uniqueidentifier] NULL,
	[adr_modified_date] [datetime] NULL,
	[adr_deleted_byid] [uniqueidentifier] NULL,
	[adr_deleted_date] [datetime] NULL,
    [adr_mode]    CHAR(1)      NOT NULL
)
GO
CREATE TRIGGER tradressUPDATE ON dbo.adress FOR UPDATE
AS
INSERT INTO dbo.adressLog 
  ([adr_adressid],[adr_street],[adr_house],[adr_plz],[adr_place],[adr_countryid],[adr_active],[adr_created_byid],[adr_created_date],
   [adr_modified_byid],[adr_modified_date],[adr_deleted_byid],[adr_deleted_date],[adr_mode]) 
SELECT *,'U' FROM inserted
GO
CREATE TRIGGER tradressDELETE ON adress FOR DELETE
AS
INSERT INTO adressLog 
  ([adr_adressid],[adr_street],[adr_house],[adr_plz],[adr_place],[adr_countryid],[adr_active],[adr_created_byid],[adr_created_date],
   [adr_modified_byid],[adr_modified_date],[adr_deleted_byid],[adr_deleted_date],[adr_mode]) 
SELECT *,'D' FROM deleted
GO

So sah das seinerzeits aus und die Verarbeitung hat der SQL Server getätigt ohne das etwas programmiert werden musste 🙂

1.200 Beiträge seit 2007
vor 15 Jahren

Stichwort: ForeignKeys.

Du musst die DeleteRule für deinen ForeignKey dann auf "Cascade" stellen. Tigger sind für so eine simple Aufgabe unnötig.

Ausserdem gewährleistest du mit Foreign Keys referentielle Integrität.

Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!

YARRRRRR!

M
MrMilk Themenstarter:in
75 Beiträge seit 2008
vor 15 Jahren

Hey,

super vielen Dank für die Antwort. Eine kleine Frage habe ich noch.

Ich gehe wie folgt vor:

In der Tabelle Mitarbeiter gucke ich nach jeder Zeile und wenn sich etwas ändert, dann führe auf dem spezialisierten Adapter die Update Funktion aus. In diesem Fall ist es das Löschen.

Nun bekomme ich folgende Exception:

The DELETE statement conflicted with the REFERENCE constraint "FK_leiht_Mitarbeiter". The conflict occurred in database "TestDatenbank", table "dbo.leiht", column 'id_Mitarbeiter'.

Kann ich auch ncoh hier irgendwo einstellen, dass automatisch weiter gelöscht wird?

"Cascade" wurde schon eingestellt.

Viele Grüße
MM

1.200 Beiträge seit 2007
vor 15 Jahren

Mir scheint da hast du dich ein wenig vertan.

Drop deinen Constraint nochmal und führe das aus:

ALTER TABLE dbo.leiht 
ADD CONSTRAINT fk_leiht_Mitarbeiter 
FOREIGN KEY (id_Mitarbeiter) 
REFERENCES dbo.mitarbeiter (id_Mitarbeiter) ON DELETE CASCADE

(Pass natürlich die Bezeichner noch an).

Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!

YARRRRRR!

M
MrMilk Themenstarter:in
75 Beiträge seit 2008
vor 15 Jahren

Super vielen Dank 🙂

nun klappt es 🙂

Grüße
MM