Avatar billede herman01753 Nybegynder
19. april 2005 - 13:45 Der er 5 kommentarer og
1 løsning

Problem med cascade delete, og "Præ delete Trigger" ønskes

jeg har to tabeller med en indbyrdes relation scriptet til tabellerne er her:
**********
CREATE TABLE [dbo].[_test2] (
    [ID] [uniqueidentifier] NOT NULL ,
    [Number] [int] NOT NULL ,
    [Name] [nvarchar] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
    [Price] [float] NOT NULL ,
    [Shop] [uniqueidentifier] NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[produt_relation_test] (
    [ID]  uniqueidentifier ROWGUIDCOL  NOT NULL ,
    [shoprelation] [uniqueidentifier] NOT NULL ,
    [Accesoryrelation] [uniqueidentifier] NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[_test2] ADD
    CONSTRAINT [PK__test2] PRIMARY KEY  CLUSTERED
    (
        [ID]
    )  ON [PRIMARY]
GO

ALTER TABLE [dbo].[produt_relation_test] ADD
    CONSTRAINT [DF_produt_relation_test_ID] DEFAULT (newid()) FOR [ID],
    CONSTRAINT [PK_produt_relation_test] PRIMARY KEY  CLUSTERED
    (
        [ID]
    )  ON [PRIMARY]
GO

ALTER TABLE [dbo].[produt_relation_test] ADD
    CONSTRAINT [FK_produt_relation_test__test2] FOREIGN KEY
    (
        [shoprelation]
    ) REFERENCES [dbo].[_test2] (
        [ID]
    ) ON DELETE CASCADE ,
    CONSTRAINT [FK_produt_relation_test__test21] FOREIGN KEY
    (
        [Accesoryrelation]
    ) REFERENCES [dbo].[_test2] (
        [ID]
    )
GO


**********

Mit problem består i at både accesoryid samt shopid er fremmednøgle i tabellen test. Men jeg kan kun lave cascade delete på den ene af de to constraints. Hvordan løser jeg problemet så jeg får slettet alle rækker hvor accesoryid er id fra test og alle rækker hvor shopid er id fra test, så jeg efterfølgende kan slette rækken i test.

Jeg har prøvet med triggers, men det kan ikke lade sig gøre, da de bliver eksekveret efter rækken i test bliver slettet, og sletningen fejler fordi der er constraintproblemer.

Jeg ønsker ikke at have min oprydningskode liggende i en storedprocedure, da der kan komme flere stored procedure til, som skal kunne tilføje, eller slette fra denne og andre tabeller, og helst ikke vil ha redundant kode. Er der nogen om kan løse problemet for mig?

Hilse Herman
Avatar billede dbangx Nybegynder
19. april 2005 - 13:58 #1
i stedet for en normal "AFTER" trigger skal du bruge "INSTEAD OF" se mere her:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_aa-az_9036.asp
Avatar billede herman01753 Nybegynder
19. april 2005 - 14:18 #2
Lad os sige at jeg laver en trigger "INSTEAD OF DELETE", som så skal rydde op. hvordan finder jeg så fre til de kriterier som den der sletter rækker i tabellen har benyttet?

Lad os sige der bliver skrevet
Delete from test where shop="..." and price = '25.25'

Hvordan hiver jeg kriterierne ud, og benytter dem til at få fat i den rigtige række så jeg senere kan slette den?
Avatar billede herman01753 Nybegynder
19. april 2005 - 15:16 #3
har fundet ud af det. men jeg kan til gengæld ikke finde ud af at slette data fra andre tabeller, kan man kun tilgå data i den tabel hvori data er ved at blive slettet?

Hvis du skriver svar, får du point.

hilsen Herman
Avatar billede dbangx Nybegynder
19. april 2005 - 16:46 #4
du burde bare kunne indsætte din "DELETE FROM table" efter as i triggeren. iflg msdn skulle det kunne lade sig gøre, MEN vær opmærksom på recursion.

se her: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_create2_7eeq.asp

som du kan se i eksempel C så tilgås flere tabeller i samme trigger
Avatar billede herman01753 Nybegynder
20. april 2005 - 09:09 #5
tak for hjælpen.
Avatar billede dbangx Nybegynder
20. april 2005 - 14:44 #6
no problemo. Tak for point :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester