Avatar billede neoman Novice
07. september 2007 - 23:50 Der er 3 kommentarer og
1 løsning

Trigge exception ved delete hvis parent har children

Jeg har en one-to-many relation defineret mellem to tabeller. Jeg ønsker, at det ikke skal være muligt at delete en række i parent tabellen, såfremt der findes tilhørende rækker i child tabellen.

Hvad er den mest effektive (mht db performance) måde at opnå dette ?

Jeg kunne i princippet selv checke om en række har children, inden jeg tillader en delete af rækken, men jeg forestiller mig DBMS'en kan gøre det meget mere effektivt. Kan den levere en exception i dette tilfælde? Hvis det er måden at gøre det på, hvordan lokkes den til det ?

Hvem har nogle vise ord ?
Avatar billede arne_v Ekspert
08. september 2007 - 03:09 #1
Eksempel:

CREATE TABLE postby (
        postnr INTEGER NOT NULL PRIMARY KEY,
        postby VARCHAR(20)
)
GO
CREATE TABLE addresse (
    id INTEGER NOT NULL PRIMARY KEY,
        vejnavn VARCHAR(50),
        vejnr INTEGER,
        postnr INTEGER CONSTRAINT postnr_fk_c REFERENCES postby(postnr)
)
GO
Avatar billede arne_v Ekspert
08. september 2007 - 03:20 #2
Eller hvis det skal være en trigger:

CREATE TABLE postby (
        postnr INTEGER NOT NULL PRIMARY KEY,
        postby VARCHAR(20)
)
GO
CREATE TABLE addresse (
    id INTEGER NOT NULL PRIMARY KEY,
        vejnavn VARCHAR(50),
        vejnr INTEGER,
        postnr INTEGER
)
GO
CREATE TRIGGER postnr_check ON postby
FOR DELETE
AS
IF EXISTS(SELECT * FROM addresse WHERE postnr = (SELECT postnr FROM DELETED))
BEGIN
    RAISERROR ('Hold fingrene fra det her postnummer', 16, 1)
END
GO
Avatar billede neoman Novice
08. september 2007 - 13:18 #3
Tak for det - vidste der måtte være en løsning.

Jeg har problemer med :
  postnr INTEGER CONSTRAINT postnr_fk_c REFERENCES postby(postnr)

kan ikke lige finde en måde at gøre det på inde i VS. Findes der en ?

Jeg har bladret lidt mere i dokumentationen for sql, og deraf lader det til, at hvis jeg laver en  FK_Child_Parent og siger:ON DELETE = NO ACTION så vil jeg få den ønskede exception, hvis jeg prøver at delete en parent og der eksisterer børn. Dette kan jeg nemt få adgang til i VS.

'arne_v' - tak for hjælpen og læg et svar:)
Avatar billede arne_v Ekspert
08. september 2007 - 15:41 #4
Jeg kunne ikke drømme om at bruge en IDE som database administrations værktøj, så det
har jeg ingen anelser om.

Og et svar.
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