Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Loeschen von Datensätzen verstößt gegen Column Reference-Einschränkung

297 views
Skip to first unread message

Anja Baumann

unread,
Jul 1, 2003, 11:07:59 AM7/1/03
to
Hallo NG,
Ich arbeite mit einer .adp und SQL 2000.
In einem Haupt-Formular lasse ich die Daten der Haupt-Tabelle_Firma
darstellen. Für 3 weitere verbundene Tabellen lasse ich mir Unter-Formulare
anzeigen.
Klappt beim Eingeben und erzeugen der einzelnen Datensätze ganz gut.

Beim Löschen eines Satzes der Tabelle_Firma erscheint die Meldung:
Die DELETE-Anweisung verstieß gegen dieCOLU`MN REFERENCE-Einschränkung
'FK_StammdatenII_Tabelle_Firma'. Der Konflikt trat in der DB-Datenbank,
Tabelle 'StammdatenII', Column 'STII_Numer' auf.

Nun habe ich mir gedacht, da schreib ich doch mal einen Trigger, damit die
Datensätze in den verbundenen Tabellen auch wirklich gelöscht werden:

ALTER TRIGGER Loeschen_Firma
ON dbo.Tabelle_Firma
FOR DELETE
AS
declare @ID as INT
Select @ID = F_Schluessel from deleted
Delete Stammdaten where ST_Nummer = @id
Delete StammdatenII where STII_Nummer = @id

Geht trotzdem nicht.

Jetzt komme ich nicht weiter.
Würde mich sehr freuen, wenn mir jemanf helfen könnte.
Gruß
Anja


Philipp Stiefel

unread,
Jul 1, 2003, 1:12:10 PM7/1/03
to
Anja Baumann <bau...@baumel.de> schrieb:

> Beim Löschen eines Satzes der Tabelle_Firma erscheint die Meldung:
> Die DELETE-Anweisung verstieß gegen dieCOLU`MN REFERENCE-Einschränkung
> 'FK_StammdatenII_Tabelle_Firma'. Der Konflikt trat in der DB-Datenbank,
> Tabelle 'StammdatenII', Column 'STII_Numer' auf.
>
> Nun habe ich mir gedacht, da schreib ich doch mal einen Trigger, damit die
> Datensätze in den verbundenen Tabellen auch wirklich gelöscht werden:
>
> ALTER TRIGGER Loeschen_Firma
> ON dbo.Tabelle_Firma
> FOR DELETE

[...]

> Geht trotzdem nicht.

Kann nicht gehen, weil der Trigger erst dann ausgelöst wird,
wenn wirklich gelöscht wird. - Genau das passiert aber wegen
der Schlüsselverletzung nie.

Lies mal in der SQL-Server-Dokumentation unter ALTER TABLE -
ADD CONSTRAINT nach. Das ON DELETE CASCADE-Attribut dürfte
dein Problem lösen.

Ich würde stattdessen lieber eine Stored Procedure schreiben,
die die Daten löscht. - Das ist IMO flexibler und leichter
nachzuvollziehbar/wartbar.

Gruß
Phil

--
Richtig zitieren im Usenet -> http://got.to/quote

Anja Baumann

unread,
Jul 2, 2003, 3:20:18 AM7/2/03
to
Hallo Phil,
erstmal vielen Dank für Deine Antwort.

"Philipp Stiefel" <ph...@codekabinett.de> schrieb im Newsbeitrag
news:bdsmb...@pluto.ksw.codekabinett.com...

Wie Du an meinen vielen Fragen siehst, beschäftige ich mich noch nicht sooo
lange mit .adp´s.
Kann ich den Aufruf der Stored Procedure an den Button zum Löschen hängen,
in der Art "beim Klicken" - Aufruf der Stored Procedure ?
Wie würdest Du die Stored Procedure aufbauen ?

Gruß
Anja


Philipp Stiefel

unread,
Jul 2, 2003, 9:12:15 AM7/2/03
to
Anja Baumann <bau...@baumel.de> schrieb:
>"Philipp Stiefel" <ph...@codekabinett.de> schrieb:
>> Anja Baumann <bau...@baumel.de> schrieb:

>> > Beim Löschen eines Satzes der Tabelle_Firma erscheint die Meldung:
>> > Die DELETE-Anweisung verstieß gegen dieCOLU`MN REFERENCE-Einschränkung
>> > 'FK_StammdatenII_Tabelle_Firma'. Der Konflikt trat in der DB-Datenbank,
>> > Tabelle 'StammdatenII', Column 'STII_Numer' auf.

[...]

>> Ich würde stattdessen lieber eine Stored Procedure schreiben,
>> die die Daten löscht. - Das ist IMO flexibler und leichter
>> nachzuvollziehbar/wartbar.


[...]


>Kann ich den Aufruf der Stored Procedure an den Button zum Löschen hängen,
>in der Art "beim Klicken" - Aufruf der Stored Procedure ?

Ja, im Prinzip schon.

>Wie würdest Du die Stored Procedure aufbauen ?


---------------------------------------------------------------
CREATE PROCEDURE dbo.sp_LoescheDaten (
@Schluessel int
)
AS
BEGIN

SET ROWCOUNT 0
SET NOCOUNT ON

DECLARE @ErrState int

SELECT @ErrState = 0

BEGIN TRANSACTION

DELETE FROM dbo.tblDetail1 WHERE SchluesselFeld = @Schluessel
SELECT @ErrState = @ErrState + @@error

DELETE FROM dbo.tblDetail2 WHERE SchluesselFeld = @Schluessel
SELECT @ErrState = @ErrState + @@error

DELETE FROM dbo.tblMaster WHERE SchluesselFeld = @Schluessel
SELECT @ErrState = @ErrState + @@error

IF @ErrState = 0
COMMIT TRANSACTION
ELSE
BEGIN
ROLLBACK TRANSACTION
RAISERROR('Fehler beim Löschen der Daten!',16,1)
END

SET ROWCOUNT 0
SET NOCOUNT OFF

END
---------------------------------------------------------------


Aufruf in VBA:

Public Sub LoescheDaten (byval lngSchluessel as long)
Currentproject.Connection.Execute "EXEC dbo.sp_LoescheDaten " & lngSchluessel
End sub

0 new messages