/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Vil ikke lave relation - SQL 2005
Fra : KS


Dato : 07-02-09 08:18

Jeg har en database med 2 tabeller LAND og FIRMAAFD.

En primærnøgle i LAND LandId og en fremmednøgle i FIRMAAFD AfdLandId.

Der ER fylde data i tabellerne og nu vil jeg lave relationen, og jeg har
tjekket:

1) at alle værdier i AfdLandId allerede findes i LandId
2) testet for evt. mellemrum før og efter i begge tabeller

Jeg vil gerne have kaskadevis opdatering og sletning og derfor indstillet
til det alligevel får jeg følgende meddelelse, når jeg forsøger at lave
relationen:

'LAND' table saved successfully
'FIRMAAFD' table
- Unable to create relationship 'FK_FIRMAAFD_LAND'.
Introducing FOREIGN KEY constraint 'FK_FIRMAAFD_LAND' on table 'FIRMAAFD'
may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or
ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint. See previous errors.

Jeg har en tilsvarende relation et andet sted i databasen, med de samme
indstillinger - og her er der ingen problem.

Hvad er det jeg overser ?

Mvh KSor


 
 
Peter Lykkegaard (07-02-2009)
Kommentar
Fra : Peter Lykkegaard


Dato : 07-02-09 08:37

"KSsoerensen
>
> Jeg vil gerne have kaskadevis opdatering og sletning

Begrundelse?

> Introducing FOREIGN KEY constraint 'FK_FIRMAAFD_LAND' on table 'FIRMAAFD'
> may cause cycles or multiple cascade paths.
http://support.microsoft.com/default.aspx/kb/321843

> Hvad er det jeg overser ?
>
Måske skal dit design kikkes lidt efter i sømmene?

- Peter



KS (07-02-2009)
Kommentar
Fra : KS


Dato : 07-02-09 09:33

"Peter Lykkegaard" <plykkegaard@gmail.com> skrev i meddelelsen
news:498d3a33$0$90276$14726298@news.sunsite.dk...
> "KSsoerensen
>>
>> Jeg vil gerne have kaskadevis opdatering og sletning
>
> Begrundelse?
Kaskasdevis opdatering er da efter min mening en god facilitet, som sparer
mig for kode.

Når jeg sletter et LAND, fordi jeg at forskellige grunde ikke vil hadle med
det pågældende land, så skal alle afdelinger i det pågældende land slette
automatisk.

>
>> Introducing FOREIGN KEY constraint 'FK_FIRMAAFD_LAND' on table 'FIRMAAFD'
>> may cause cycles or multiple cascade paths.
> http://support.microsoft.com/default.aspx/kb/321843
>
>> Hvad er det jeg overser ?
>>
> Måske skal dit design kikkes lidt efter i sømmene?
>
Måske, men det er vel også derfor jeg starter dette indlæg og regner med at
få nogle konstruktive ideer ... ikk' ?

Tabellen FIRMAAFD er jo også relateret til tabellen FIRMA, hvor nøjagtig den
samme opsætning af relationen mellem FirmaId i tabellen FIRMA og AfdFirmaId
i tabellen FIRMAAFD er brugt UDEN problemer - og argumentationen er her jo,
at hvis jeg opdaterer et FirmaId, skal alle eventuelle afdelingerne "bare
tilrette" AfdFirmaId automatisk - det sparer mig kode. Og kaskadevis
sletning er vel indlysende - sletter jeg firmaet har jeg jo intet at bruge
afdelingerne til - så væk men dem også automatisk.

Er det noget med at en tabel ikke kan indgå i FLERE relationer, hvor dette
kaskadevis opdatering og sletning er sat på ?

Og hvis DET er tilfældet, hvad er så begrundelsen ?

Mvh KSor



KS (07-02-2009)
Kommentar
Fra : KS


Dato : 07-02-09 09:58

I got it - tror jeg !

Ses på de 3 tabeller LAND, FIRMAAFD og FIRMA så kan relationen mellem LAND
og FIRMAFD ikke have kaskadevis sletning, da afdelingerne ikke skal slettes,
som følge af at landet slettes, men afdelingerne i det slettede land skal
slettes fordi FIRMAERNE i det pågældende land slettes - derfor skal der være
kaskadevis sletning mellem LAND og FIRMA og så kan der ikke OGSÅ være det
mellem LAND og FIRMAAFD - er det ikke forklaringen omkring sletning ?

Mht kaskadevis opdatering vil jeg da stadig mene, at det skal være muligt på
relationen mellem LAND og FIRMAAFD og også i relationen mellem LAND og
FIRMA (nu sidder jeg ikke lige med db'en så jeg kan prøve)

Mvh


"KS soerensen@os.dk>" <keld.<SLET_DETTE> skrev i meddelelsen
news:498d4735$0$15887$edfadb0f@dtext01.news.tele.dk...
> "Peter Lykkegaard" <plykkegaard@gmail.com> skrev i meddelelsen
> news:498d3a33$0$90276$14726298@news.sunsite.dk...
>> "KSsoerensen
>>>
>>> Jeg vil gerne have kaskadevis opdatering og sletning
>>
>> Begrundelse?
> Kaskasdevis opdatering er da efter min mening en god facilitet, som sparer
> mig for kode.
>
> Når jeg sletter et LAND, fordi jeg at forskellige grunde ikke vil hadle
> med det pågældende land, så skal alle afdelinger i det pågældende land
> slette automatisk.
>
>>
>>> Introducing FOREIGN KEY constraint 'FK_FIRMAAFD_LAND' on table
>>> 'FIRMAAFD' may cause cycles or multiple cascade paths.
>> http://support.microsoft.com/default.aspx/kb/321843
>>
>>> Hvad er det jeg overser ?
>>>
>> Måske skal dit design kikkes lidt efter i sømmene?
>>
> Måske, men det er vel også derfor jeg starter dette indlæg og regner med
> at få nogle konstruktive ideer ... ikk' ?
>
> Tabellen FIRMAAFD er jo også relateret til tabellen FIRMA, hvor nøjagtig
> den samme opsætning af relationen mellem FirmaId i tabellen FIRMA og
> AfdFirmaId i tabellen FIRMAAFD er brugt UDEN problemer - og
> argumentationen er her jo, at hvis jeg opdaterer et FirmaId, skal alle
> eventuelle afdelingerne "bare tilrette" AfdFirmaId automatisk - det sparer
> mig kode. Og kaskadevis sletning er vel indlysende - sletter jeg firmaet
> har jeg jo intet at bruge afdelingerne til - så væk men dem også
> automatisk.
>
> Er det noget med at en tabel ikke kan indgå i FLERE relationer, hvor dette
> kaskadevis opdatering og sletning er sat på ?
>
> Og hvis DET er tilfældet, hvad er så begrundelsen ?
>
> Mvh KSor
>
>


Peter Lykkegaard (07-02-2009)
Kommentar
Fra : Peter Lykkegaard


Dato : 07-02-09 09:59

"KSsoerensen skrev

> Er det noget med at en tabel ikke kan indgå i FLERE relationer, hvor dette
> kaskadevis opdatering og sletning er sat på ?
>
the tree of cascading referential actions must only have one path to a
particular table on the cascading referential actions tree.

Fra firma til land
Fra afdeling til land
Fra firma til afdeling til land
Fra afdeling til firma til land

> Og hvis DET er tilfældet, hvad er så begrundelsen ?
>
Det er by design
Jeg kender ikke begrundelsen for hvorfor MS har designet det på den måde

Normalt vil man bruge triggers (insert/update/delete) til få db til at
overholde dataintegriteten da det giver den største fleksibilitet
Dvs hvis man overhovedet vil lægge regler for dataintegritet på det niveau
og derved sprede forretningslogik til flere forskellige niveauer

Btw mulighed for ændring af fx firmaid er nok ikke den klogeste beslutning
:)
Jeg formoder at firmaid er en primærnøgle der indgår i en del relationer?

I den yderste konsekvens kan man komme på kant med forskellige dele af
lovgivningen
Har du finansposter/bogføring etc i dit system?

- Peter



KS (07-02-2009)
Kommentar
Fra : KS


Dato : 07-02-09 10:27

> Btw mulighed for ændring af fx firmaid er nok ikke den klogeste beslutning
> :)
Jow da.

> Jeg formoder at firmaid er en primærnøgle der indgår i en del relationer?
>
Formodningen er rigtig.

> I den yderste konsekvens kan man komme på kant med forskellige dele af
> lovgivningen
Overhovedet ikke !

> Har du finansposter/bogføring etc i dit system?
>
Nej

Mvh KSor


Peter Lykkegaard (07-02-2009)
Kommentar
Fra : Peter Lykkegaard


Dato : 07-02-09 10:52

"KSsoerensen skrev

>> Btw mulighed for ændring af fx firmaid er nok ikke den klogeste
>> beslutning :)
> Jow da.
>
Hvad er begrundelsen?

>> I den yderste konsekvens kan man komme på kant med forskellige dele af
>> lovgivningen

> Overhovedet ikke !

Kommer an på typen af applikation
Fedter man med bogføringsdata så er der nogen krav i forhold til
lovgivningen der skal overholdes

- Peter



KS (07-02-2009)
Kommentar
Fra : KS


Dato : 07-02-09 11:22

"Peter Lykkegaard" <plykkegaard@gmail.com> skrev i meddelelsen
news:498d59b5$0$90268$14726298@news.sunsite.dk...
> "KSsoerensen skrev
>
>>> Btw mulighed for ændring af fx firmaid er nok ikke den klogeste
>>> beslutning :)
>> Jow da.
>>
> Hvad er begrundelsen?
>
Nu var det overhovedet ikke emnet
og jeg vil gerne have, at man kan ændre FirmaId - derfor.

Alle disse ord var bedre at bruge i forbindelse med forklaring
af det oprindelige problem.

Men jeg vil prøve det af.

Mvh KSor


Peter Lykkegaard (07-02-2009)
Kommentar
Fra : Peter Lykkegaard


Dato : 07-02-09 11:45

KSsoerensen skrev

> Nu var det overhovedet ikke emnet
> og jeg vil gerne have, at man kan ændre FirmaId - derfor.
>
Det er et frit land

- Peter



KS (08-02-2009)
Kommentar
Fra : KS


Dato : 08-02-09 08:28

"Peter Lykkegaard" <plykkegaard@gmail.com> skrev i meddelelsen
news:498d3a33$0$90276$14726298@news.sunsite.dk...
> "KSsoerensen
>>
>> Jeg vil gerne have kaskadevis opdatering og sletning
>
> Begrundelse?
>
>> Introducing FOREIGN KEY constraint 'FK_FIRMAAFD_LAND' on table 'FIRMAAFD'
>> may cause cycles or multiple cascade paths.
> http://support.microsoft.com/default.aspx/kb/321843
>
Nu har jeg konstrueret et lille eksempel på SQL-serveren og i MS Access med

LAND
FIRMA
FIRMAAFD

Med relationer mellem LAND-FIRMA (relation A), LAND-FIRMAAFD (B) og
FIRMA-FIRMAAFD (C)

I MS Access kan der være kaskadevis opdatering og sletning på alle
relationerne og det virker efter hensigten.

På SQL-serveren er der den besynderlige "begrænsning" og ovenikøbet "by
design", at relationen (B) IKKE kan - ja, den må overhovedet IKKE være der
uanset hvilken kombination mellem kaskadevis opdaterin/sletning og "Foreign
Key Constraint" der forsøges !

Hvad er det dog for noget skrammel !

Nå, men så må jeg jo til at se på "triggers"

Mvh KSor



KS (08-02-2009)
Kommentar
Fra : KS


Dato : 08-02-09 13:35

"KS soerensen@os.dk>" <keld.<SLET_DETTE> skrev i meddelelsen
news:498e8980$0$15880$edfadb0f@dtext01.news.tele.dk...
> "Peter Lykkegaard" <plykkegaard@gmail.com> skrev i meddelelsen
> news:498d3a33$0$90276$14726298@news.sunsite.dk...
>> "KSsoerensen
>>>
>>> Jeg vil gerne have kaskadevis opdatering og sletning
>>
>> Begrundelse?
>>
>>> Introducing FOREIGN KEY constraint 'FK_FIRMAAFD_LAND' on table
>>> 'FIRMAAFD' may cause cycles or multiple cascade paths.
>> http://support.microsoft.com/default.aspx/kb/321843
>>
> Nu har jeg konstrueret et lille eksempel på SQL-serveren og i MS Access
> med
>
> LAND
> FIRMA
> FIRMAAFD
>
> Med relationer mellem LAND-FIRMA (relation A), LAND-FIRMAAFD (B) og
> FIRMA-FIRMAAFD (C)
>
> I MS Access kan der være kaskadevis opdatering og sletning på alle
> relationerne og det virker efter hensigten.
>
> På SQL-serveren er der den besynderlige "begrænsning" og ovenikøbet "by
> design", at relationen (B) IKKE kan - ja, den må overhovedet IKKE være der
> uanset hvilken kombination mellem kaskadevis opdaterin/sletning og
> "Foreign Key Constraint" der forsøges !
>
> Hvad er det dog for noget skrammel !
>
> Nå, men så må jeg jo til at se på "triggers"
>
> Mvh KSor
>
Jeg syned de eksempler som findes "derude" er noget uoverskuelige - derfor:

Er der nogen af jer, som har noget kode, som viser en sådan "Trigger" til
opnåelse af den effekt som "kaskadevis sletning og opdatering" kombineret
med Referentiel integritet har i f.eks. MS Access ?

Mvh KSor


KS (09-02-2009)
Kommentar
Fra : KS


Dato : 09-02-09 19:06


"KS soerensen@os.dk>" <keld.<SLET_DETTE> skrev i meddelelsen
news:498e8980$0$15880$edfadb0f@dtext01.news.tele.dk...
> "Peter Lykkegaard" <plykkegaard@gmail.com> skrev i meddelelsen
> news:498d3a33$0$90276$14726298@news.sunsite.dk...
>> "KSsoerensen
>>>
>>> Jeg vil gerne have kaskadevis opdatering og sletning
>>
>> Begrundelse?
>>
>>> Introducing FOREIGN KEY constraint 'FK_FIRMAAFD_LAND' on table
>>> 'FIRMAAFD' may cause cycles or multiple cascade paths.
>> http://support.microsoft.com/default.aspx/kb/321843
>>
> Nu har jeg konstrueret et lille eksempel på SQL-serveren og i MS Access
> med
>
> LAND
> FIRMA
> FIRMAAFD
>
> Med relationer mellem LAND-FIRMA (relation A), LAND-FIRMAAFD (B) og
> FIRMA-FIRMAAFD (C)
>
> I MS Access kan der være kaskadevis opdatering og sletning på alle
> relationerne og det virker efter hensigten.
>
> På SQL-serveren er der den besynderlige "begrænsning" og ovenikøbet "by
> design", at relationen (B) IKKE kan - ja, den må overhovedet IKKE være der
> uanset hvilken kombination mellem kaskadevis opdaterin/sletning og
> "Foreign Key Constraint" der forsøges !
>
> Hvad er det dog for noget skrammel !
>
> Nå, men så må jeg jo til at se på "triggers"
>
Ups, jeg tog fejl - relationen må godt være der, men den må ikke have
kaskadevis sletning/opdatering - og med YES til "foreign key constraint"
bliver man forhindret i at slette et land, hvis der er afdelinger, som
ligger i dette land.

Men hvad er begrundelsen for at lave denne begrænsning - det fungerer jo
ellers fint i MS Access, som i så mange andre sammenhænge nedgøres til
fordel for SQL-serveren ?

Mvh KSor


Jesper (09-02-2009)
Kommentar
Fra : Jesper


Dato : 09-02-09 21:30

Det er en design limitation i SQL server som ikke findes i andre RDMBS'er
jeg kender til. Men det er relativt kendt i SQL Server, og jeg har også selv
problemet i et af mine projekter. Mit bedste bud på årsagen er, at det ikke
er veldefineret hvilken rækkefølge UPDATE/DELETE bliver cascadet ned i en
sådan situation. Dvs: Hvis du sletter et LAND, vil din FIRMAAFD så blive
slettet pga relation B eller relation C?, og vil det blive slettet før eller
efter FIRMA?. Det kunne sikkert i en langt ude situation give problemer hvis
man havde komplicerede triggers på hvert table som lavede noget i et af de
andre tables, og at rækkefølgen af dette havde en betydning.

Der er adskillige mulige løsninger:
1) Drop cascading UPDATE/DELETE på en af relationernerne. således at du ikke
har en 'cyklus', men kun en entydig træstruktur.
2) Lav en stored procedure der laver din delete/update, som også sørger for
alle følgevirkninger.
3) Lav en trigger på hoved tabellen som sørger for følgevirkningerne af
update/delete
4) Split den problematiske tabel til 2 selvstændige tabeller
(FIRMAAFD_LANDE, og FIRMAAFD_FIRMA). Dette giver dog kun god mening hvis de
2 sæt data ikke skal dele de samme rækker.


Jesper.



KS (11-02-2009)
Kommentar
Fra : KS


Dato : 11-02-09 18:33

> Det er en design limitation i SQL server som ikke findes i andre RDMBS'er
> jeg kender til. Men det er relativt kendt i SQL Server, og jeg har også
> selv problemet i et af mine projekter. Mit bedste bud på årsagen er, at
> det ikke er veldefineret hvilken rækkefølge UPDATE/DELETE bliver cascadet
> ned i en sådan situation. Dvs: Hvis du sletter et LAND, vil din FIRMAAFD
> så blive slettet pga relation B eller relation C?, og vil det blive
> slettet før eller efter FIRMA?. Det kunne sikkert i en langt ude situation
> give problemer hvis man havde komplicerede triggers på hvert table som
> lavede noget i et af de andre tables, og at rækkefølgen af dette havde en
> betydning.

Det har tydeligvis IKKE været en bekymring som MS Access folkene har
haft, idet det virker uden disse lidt "tågede problemer" - "design
limitation" !
>
> Der er adskillige mulige løsninger:

Ja, jeg er mest tilhænger af en løsning, hvor det sker UDEN min indblanden
overhovedet, og så skal det vel være en "trigger" - du siger på
"hovedtabellen"
.... er det i dette tilfælde LAND ?

Og triggeren opgave skal så være ved opdatering af et LAND at foretage
opdatering
i FIRMAAFD.

Resten klares jo af relationen mellem LAND og FIRMA.

Du har ikke et eksempel på en sådan "trigger" ?

Mvh KSor


Jesper (11-02-2009)
Kommentar
Fra : Jesper


Dato : 11-02-09 22:37

Tja, jeg er enig med dig i at denne begræsning virker lidt overflødig, da
man nok blot kunne dokumentere en veldefineret orden at delete'sne blev
udført i (hvis det ellers er det som er problemet). Men jeg vil nu slet ikke
gå så langt som til at sige at MS Access er bedre fordi den ikke har samme
begræsning. Man har i Access lavet så mange antagelser om normal brug, at
der ikke skal meget til i virkelighedens verden for at din database bliver
corrupted.

Hvis vi blot taget DELETE operationen som eksempel:

Du kan vælge enten metode A:
- Drop helt at have en relation imellem LAND og FIRMAAFD og lav en trigger
således:

CREATE TRIGGER trg_DeleteLand ON LAND
FOR DELETE
AS
BEGIN
DELETE FIRMAAFD FROM FIRMAAFD, deleted
WHERE FIRMAAFD.nLandID=deleted.nLandID
END

Ovennævnte vil ikke virke hvis du har en relation imellem LAND og FIRMAAFD,
fordi den først vil blive udførst *efter* at den refererede række i
hovedtabellen (LAND) forsøges deleted...så inden triggeren overhovedet
kommer i spil vil der være et brudt på 'referential integrity' idet du i
FIRMAAFD nu refererer til en key der ikke længere eksisterer i LAND. Derfor
virker ovenstående kun hvis der ikke er en relation.

Hvis du gerne vil have at der er en LAND-FIRMAAFD relation kan du lave den
(uden cascading updates på den), og så lave følgende trigger:

CREATE TRIGGER trg_DeleteLand ON LAND
INSTEAD OF DELETE
AS
BEGIN
DELETE FIRMAAFD FROM FIRMAAFD, deleted
WHERE FIRMAAFD.nLandID=deleted.nLandID

DELETE LAND FROM LAND, deleted
WHERE LAND.nLandID=deleted.nLandID
END


Her går du ind og siger at *før* den overhovedet prøver at delete rækken i
LAND, så går du ind og sletter de relaterede rækker i FIRMAAFD. Herefter er
du selv ansvarlig for at slette rækken i LAND, hvilket sker i linie 2.

Update med metode A (kræver at der ikke er en relation):

ALTER TRIGGER tgg_UpdateLand ON LAND
FOR UPDATE
AS
BEGIN
IF UPDATE(nLandID)
BEGIN
UPDATE FIRMAAFD
SET FIRMAAFD.nLandID=inserted.nLandID
FROM FIRMAAFD, deleted, inserted
WHERE deleted.nLandID=FIRMAAFD.nLandID
END
END

En update samtidigt med at du har en aktiv relation har jeg faktisk svært
ved at se hvordan man skal gøre. Man bliver givetvist nødt til at disable
relationen først, og aktivere den igen efter kaldet.

Jesper.



KS (15-02-2009)
Kommentar
Fra : KS


Dato : 15-02-09 07:00

Thanks - Jesper, det vil jeg prøve

Mvh KSor

"Jesper" <no@spam.com> skrev i meddelelsen
news:4993450d$0$90272$14726298@news.sunsite.dk...
> Tja, jeg er enig med dig i at denne begræsning virker lidt overflødig, da
> man nok blot kunne dokumentere en veldefineret orden at delete'sne blev
> udført i (hvis det ellers er det som er problemet). Men jeg vil nu slet
> ikke gå så langt som til at sige at MS Access er bedre fordi den ikke har
> samme begræsning. Man har i Access lavet så mange antagelser om normal
> brug, at der ikke skal meget til i virkelighedens verden for at din
> database bliver corrupted.
>
> Hvis vi blot taget DELETE operationen som eksempel:
>
> Du kan vælge enten metode A:
> - Drop helt at have en relation imellem LAND og FIRMAAFD og lav en trigger
> således:
>
> CREATE TRIGGER trg_DeleteLand ON LAND
> FOR DELETE
> AS
> BEGIN
> DELETE FIRMAAFD FROM FIRMAAFD, deleted
> WHERE FIRMAAFD.nLandID=deleted.nLandID
> END
>
> Ovennævnte vil ikke virke hvis du har en relation imellem LAND og
> FIRMAAFD, fordi den først vil blive udførst *efter* at den refererede
> række i hovedtabellen (LAND) forsøges deleted...så inden triggeren
> overhovedet kommer i spil vil der være et brudt på 'referential integrity'
> idet du i FIRMAAFD nu refererer til en key der ikke længere eksisterer i
> LAND. Derfor virker ovenstående kun hvis der ikke er en relation.
>
> Hvis du gerne vil have at der er en LAND-FIRMAAFD relation kan du lave den
> (uden cascading updates på den), og så lave følgende trigger:
>
> CREATE TRIGGER trg_DeleteLand ON LAND
> INSTEAD OF DELETE
> AS
> BEGIN
> DELETE FIRMAAFD FROM FIRMAAFD, deleted
> WHERE FIRMAAFD.nLandID=deleted.nLandID
>
> DELETE LAND FROM LAND, deleted
> WHERE LAND.nLandID=deleted.nLandID
> END
>
>
> Her går du ind og siger at *før* den overhovedet prøver at delete rækken i
> LAND, så går du ind og sletter de relaterede rækker i FIRMAAFD. Herefter
> er du selv ansvarlig for at slette rækken i LAND, hvilket sker i linie 2.
>
> Update med metode A (kræver at der ikke er en relation):
>
> ALTER TRIGGER tgg_UpdateLand ON LAND
> FOR UPDATE
> AS
> BEGIN
> IF UPDATE(nLandID)
> BEGIN
> UPDATE FIRMAAFD
> SET FIRMAAFD.nLandID=inserted.nLandID
> FROM FIRMAAFD, deleted, inserted
> WHERE deleted.nLandID=FIRMAAFD.nLandID
> END
> END
>
> En update samtidigt med at du har en aktiv relation har jeg faktisk svært
> ved at se hvordan man skal gøre. Man bliver givetvist nødt til at disable
> relationen først, og aktivere den igen efter kaldet.
>
> Jesper.
>


KS (15-02-2009)
Kommentar
Fra : KS


Dato : 15-02-09 08:13

"Jesper" <no@spam.com> skrev i meddelelsen
news:4993450d$0$90272$14726298@news.sunsite.dk...
> Tja, jeg er enig med dig i at denne begræsning virker lidt overflødig, da
> man nok blot kunne dokumentere en veldefineret orden at delete'sne blev
> udført i (hvis det ellers er det som er problemet). Men jeg vil nu slet
> ikke gå så langt som til at sige at MS Access er bedre fordi den ikke har
> samme begræsning. Man har i Access lavet så mange antagelser om normal
> brug, at der ikke skal meget til i virkelighedens verden for at din
> database bliver corrupted.
>
> Hvis vi blot taget DELETE operationen som eksempel:
>
> Du kan vælge enten metode A:
> - Drop helt at have en relation imellem LAND og FIRMAAFD og lav en trigger
> således:
>
> CREATE TRIGGER trg_DeleteLand ON LAND
> FOR DELETE
> AS
> BEGIN
> DELETE FIRMAAFD FROM FIRMAAFD, deleted
> WHERE FIRMAAFD.nLandID=deleted.nLandID
> END
>
> Ovennævnte vil ikke virke hvis du har en relation imellem LAND og
> FIRMAAFD, fordi den først vil blive udførst *efter* at den refererede
> række i hovedtabellen (LAND) forsøges deleted...så inden triggeren
> overhovedet kommer i spil vil der være et brudt på 'referential integrity'
> idet du i FIRMAAFD nu refererer til en key der ikke længere eksisterer i
> LAND. Derfor virker ovenstående kun hvis der ikke er en relation.
>
> Hvis du gerne vil have at der er en LAND-FIRMAAFD relation kan du lave den
> (uden cascading updates på den), og så lave følgende trigger:
>
> CREATE TRIGGER trg_DeleteLand ON LAND
> INSTEAD OF DELETE
> AS
> BEGIN
> DELETE FIRMAAFD FROM FIRMAAFD, deleted
> WHERE FIRMAAFD.nLandID=deleted.nLandID
>
> DELETE LAND FROM LAND, deleted
> WHERE LAND.nLandID=deleted.nLandID
> END
>
>
> Her går du ind og siger at *før* den overhovedet prøver at delete rækken i
> LAND, så går du ind og sletter de relaterede rækker i FIRMAAFD. Herefter
> er du selv ansvarlig for at slette rækken i LAND, hvilket sker i linie 2.
>
> Update med metode A (kræver at der ikke er en relation):
>
> ALTER TRIGGER tgg_UpdateLand ON LAND
> FOR UPDATE
> AS
> BEGIN
> IF UPDATE(nLandID)
> BEGIN
> UPDATE FIRMAAFD
> SET FIRMAAFD.nLandID=inserted.nLandID
> FROM FIRMAAFD, deleted, inserted
> WHERE deleted.nLandID=FIRMAAFD.nLandID
> END
> END
>
> En update samtidigt med at du har en aktiv relation har jeg faktisk svært
> ved at se hvordan man skal gøre. Man bliver givetvist nødt til at disable
> relationen først, og aktivere den igen efter kaldet.
>
> Jesper.
Ja, se det virker faktisk meget ovebevisende pånær det med, at der nu ikke
længere er en relation mellem LAND og FIRMAAFD til at sørge for den
referentielle integritet.

Du nævner, at HVIS relationen er der, skal den muligvis "disables før
kaldet".
1) Hvordan "disables" en relation - jeg kan slette den og lave den igen, men
hvordan "disables" den ???
2) Du skriver godt nok "før" kaldet, men hvis relationen kan "disables" med
noget SQL-kode, kan det så ikke gøres I SELVE trigeren - disable den i
starten an ebable den igen i slutningen af triggeren ?

Mvh
KSor


Jesper (15-02-2009)
Kommentar
Fra : Jesper


Dato : 15-02-09 19:35

Hvis din constraint hedder FK_FIRMAAFD_LAND :

Disable:
ALTER TABLE FIRMAAFD NOCHECK CONSTRAINT FK_FIRMAAFD_LAND

Re-Enable:
ALTER TABLE FIRMAAFD CHECK CONSTRAINT FK_FIRMAAFD_LAND


Jeg er ikke 100% sikker på om man må fyre den slags kommandoer af i en
trigger, men du kan jo prøve.


Jesper.



KS (16-02-2009)
Kommentar
Fra : KS


Dato : 16-02-09 17:56


"Jesper" <no@spam.com> skrev i meddelelsen
news:4998606e$0$90272$14726298@news.sunsite.dk...
> Hvis din constraint hedder FK_FIRMAAFD_LAND :
>
> Disable:
> ALTER TABLE FIRMAAFD NOCHECK CONSTRAINT FK_FIRMAAFD_LAND
>
> Re-Enable:
> ALTER TABLE FIRMAAFD CHECK CONSTRAINT FK_FIRMAAFD_LAND
>
>
> Jeg er ikke 100% sikker på om man må fyre den slags kommandoer af i en
> trigger, men du kan jo prøve.
>
>
> Jesper.
Tak for det - jeg prøver !

Mvh KSor


KSor (03-03-2009)
Kommentar
Fra : KSor


Dato : 03-03-09 11:58


"KS soerensen@os.dk>" <keld.<SLET_DETTE> skrev i en meddelelse
news:49999a90$0$15872$edfadb0f@dtext01.news.tele.dk...
>
> "Jesper" <no@spam.com> skrev i meddelelsen
> news:4998606e$0$90272$14726298@news.sunsite.dk...
>> Hvis din constraint hedder FK_FIRMAAFD_LAND :
>>
>> Disable:
>> ALTER TABLE FIRMAAFD NOCHECK CONSTRAINT FK_FIRMAAFD_LAND
>>
>> Re-Enable:
>> ALTER TABLE FIRMAAFD CHECK CONSTRAINT FK_FIRMAAFD_LAND
>>
>>
>> Jeg er ikke 100% sikker på om man må fyre den slags kommandoer af i en
>> trigger, men du kan jo prøve.
>>
>>
>> Jesper.
> Tak for det - jeg prøver !
>
Det virker ikke - man kan åbenbart ikke lægge det ind i triggeren

Andre gode ideer ?

Mvh KS



Leif Neland (11-03-2009)
Kommentar
Fra : Leif Neland


Dato : 11-03-09 12:22

KS <keld. skrev:
> "Peter Lykkegaard" <plykkegaard@gmail.com> skrev i meddelelsen
> news:498d3a33$0$90276$14726298@news.sunsite.dk...
>> "KSsoerensen
>>>
>>> Jeg vil gerne have kaskadevis opdatering og sletning
>>
>> Begrundelse?
>>
>>> Introducing FOREIGN KEY constraint 'FK_FIRMAAFD_LAND' on table
>>> 'FIRMAAFD' may cause cycles or multiple cascade paths.
>> http://support.microsoft.com/default.aspx/kb/321843
>>
> Nu har jeg konstrueret et lille eksempel på SQL-serveren og i MS Access med
>
> LAND
> FIRMA
> FIRMAAFD
>
> Med relationer mellem LAND-FIRMA (relation A), LAND-FIRMAAFD (B) og
> FIRMA-FIRMAAFD (C)
>
> I MS Access kan der være kaskadevis opdatering og sletning på alle
> relationerne og det virker efter hensigten.
>
> På SQL-serveren er der den besynderlige "begrænsning" og ovenikøbet "by
> design", at relationen (B) IKKE kan - ja, den må overhovedet IKKE være
> der uanset hvilken kombination mellem kaskadevis opdaterin/sletning og
> "Foreign Key Constraint" der forsøges !
>
Lidt sent, men:
Relationen B er overflødig, FIRMAAFD skal ikke have feltet LAND, når en
afdeling hænger på et firma, der hænger på et land.

Eller vil du kunne have at et firma i Norge har en afdeling i Sverige?

Og hvis du så ikke vil handle med Norge, men gerne med Sverige, vil du
så handle med afdelingen i Sverige?

Leif

Peter Lykkegaard (04-03-2009)
Kommentar
Fra : Peter Lykkegaard


Dato : 04-03-09 11:39

KSorskrev
>
> Det virker ikke - man kan åbenbart ikke lægge det ind i triggeren
>
> Andre gode ideer ?
>
Drop dine foreign key constraints og styr det vha update/insert
triggers

eller
Få styr på dit databasedesign

eller
Find et andet rdbms produkt der kan det du vil

- Peter

KS (06-03-2009)
Kommentar
Fra : KS


Dato : 06-03-09 20:01

"Peter Lykkegaard" <plykkegaard@gmail.com> skrev i meddelelsen
news:46d32338-6a79-422d-b725-4059ef21da7b@e10g2000vbe.googlegroups.com...
>>KSorskrev
>>
> >Det virker ikke - man kan åbenbart ikke lægge det ind i triggeren
>>
> >Andre gode ideer ?
>>
>Drop dine foreign key constraints og styr det vha update/insert
triggers

Kan du lave et par eksempler på, hvordan sådan nogle ser ud ?

>eller
>Få styr på dit databasedesign

Designet fejler netop IKKE noget !

>eller
>Find et andet rdbms produkt der kan det du vil

Jeg vil jo nødigt skulle "gå tilbage til" Access.

Mvh KS


Peter Lykkegaard (06-03-2009)
Kommentar
Fra : Peter Lykkegaard


Dato : 06-03-09 13:47

KS skrev

> Kan du lave et par eksempler på, hvordan sådan nogle ser ud ?

Jow hvis du lægger en del af dit database schema ind her
Hvilken mssql version bruger du?
Hvis det er 2008 må jeg melde pas pt
>
> Designet fejler netop IKKE noget !

Det gør det da?
Du har redundante data i dine tabeller der giver dig nogle
problematikker vedr din implementering på mssql

> Jeg vil jo nødigt skulle "gå tilbage til" Access.
>
Access er /ikke/ blandt de rdbms jeg tænkte på
Access er et dekstop produkt og fungerer med dette udgangspunkt ganske
fornuftigt, selvom jeg har ramt loftet fornylig i forbindelse nogle
datamanipuleringen hvor programmet crashede totalt eller blot tog
timer om at køre en forholdsvis enkel forespørgsel (set med mine mssql
øjne)

- Peter

KS (07-03-2009)
Kommentar
Fra : KS


Dato : 07-03-09 08:39

"Peter Lykkegaard" <plykkegaard@gmail.com> skrev i meddelelsen
news:f9dcb9a4-66e9-490b-84c5-e89b4da83d9c@j38g2000yqa.googlegroups.com...

>Jow hvis du lægger en del af dit database schema ind her
>Hvilken mssql version bruger du?
>Hvis det er 2008 må jeg melde pas pt

Jeg bruger 2005

>>
>> Designet fejler netop IKKE noget !

>Det gør det da?
>Du har redundante data i dine tabeller der giver dig nogle
>problematikker vedr din implementering på mssql

Hvad er det for en redundance du fabler om ?

Problematikkerne opstår fordi MSSQL er lidt mangelfuld på dette
område - se bare på Access, her er det løst !

Mvh KS


Peter Lykkegaard (07-03-2009)
Kommentar
Fra : Peter Lykkegaard


Dato : 07-03-09 02:32

KS skrev

> >> Designet fejler netop IKKE noget !
> >Det gør det da?
> >Du har redundante data i dine tabeller der giver dig nogle
> >problematikker vedr din implementering på mssql
>
> Hvad er det for en redundance du fabler om ?
>
Du har de samme data i forskellige tabeller

> Problematikkerne opstår fordi MSSQL er lidt mangelfuld på dette
> område - se bare på Access, her er det løst !
>
Der er ganske mange ting Access kan som man ikke ser i et rigtig rdbms
Der er endnu flere ting et rigtigt rdbms kan som ikke Acces ikke evner
og aldrig kommer til at kunne

I den sidste ende er det et spørgsmål om pest eller kolera bruge det
rigtige værktøj rigtigt

Alle seriøse bøger der beskæftiger sig med avanceret Access udvikling
siger samstemmende at man er pisket til at lave db design samt gui
design om den dag man skifter db engine fra fx Access til mssql

- Peter

KS (07-03-2009)
Kommentar
Fra : KS


Dato : 07-03-09 15:37

"Peter Lykkegaard" <plykkegaard@gmail.com> skrev i meddelelsen
news:d275b6b1-cbdf-4edd-b2de-ae66df3ad7dd@a12g2000yqm.googlegroups.com...
KS skrev

>> >> Designet fejler netop IKKE noget !
>> >Det gør det da?
>> >Du har redundante data i dine tabeller der giver dig nogle
>> >problematikker vedr din implementering på mssql
>>
>> Hvad er det for en redundance du fabler om ?
>>
>Du har de samme data i forskellige tabeller

Ja, der er lige præcis den redundance, som er nødvendig for at
kunne lave relationerne.

>> Problematikkerne opstår fordi MSSQL er lidt mangelfuld på dette
>> område - se bare på Access, her er det løst !
>>
>Der er ganske mange ting Access kan som man ikke ser i et rigtig rdbms

Ja, men det burde man overveje at implementere - man kunne spørge MS Access
folkene, hvordan det skal laves og det kommer da nok på et tidspunkt.

>Der er endnu flere ting et rigtigt rdbms kan som ikke Acces ikke evner
>og aldrig kommer til at kunne

Muligt, men det er slet ikke emnet i denne tråd.

Mvh KS


Peter Lykkegaard (07-03-2009)
Kommentar
Fra : Peter Lykkegaard


Dato : 07-03-09 15:50

KSsoerensen skrev
..
> Ja, der er lige præcis den redundance, som er nødvendig for at
> kunne lave relationerne.

Du skal bruge ikke informationsbærende data for at lave det "korrekt"

Reelt set bør man overveje om det er korrekt udfra et historikmæssigt
synspunkt at slette en type for at oprette en anden/ny type
Ændrer man typen skal det så slå igennem for alle bærere af den gamle type,
eller skal det kun gælde for nogen og ikke for andre - og skal de "andre"
have en tredje type eller måske biobeholde den gamle type
For mig vil det være unaturligt at ændre en type vha cascade update, der er
ikke 100% kontrol med hvad der sker og ud fra et auditmæssigt synspunkt er
det helt hen i hegnet at gøre det du gerne vil

> Ja, men det burde man overveje at implementere - man kunne spørge MS
> Access
> folkene, hvordan det skal laves og det kommer da nok på et tidspunkt.

Der er ganske gode grunde til ikke at gøre det - jvf ovenfor

>>Der er endnu flere ting et rigtigt rdbms kan som ikke Acces ikke evner
>>og aldrig kommer til at kunne
>
> Muligt, men det er slet ikke emnet i denne tråd.
>
Næhh men det er hovedemnet i denne gruppe

Hvordan gik det med det databaseskema så jeg kan sætte noget op mht
triggers?

- Peter



KS (07-03-2009)
Kommentar
Fra : KS


Dato : 07-03-09 20:38

"Peter Lykkegaard" <plykkegaard@gmail.com> skrev i meddelelsen
news:49b28983$0$90271$14726298@news.sunsite.dk...
> KSsoerensen skrev
> .
>> Ja, der er lige præcis den redundance, som er nødvendig for at
>> kunne lave relationerne.
>
> Du skal bruge ikke informationsbærende data for at lave det "korrekt"
>
> Reelt set bør man overveje om det er korrekt udfra et historikmæssigt
> synspunkt at slette en type for at oprette en anden/ny type
> Ændrer man typen skal det så slå igennem for alle bærere af den gamle
> type, eller skal det kun gælde for nogen og ikke for andre - og skal de
> "andre" have en tredje type eller måske biobeholde den gamle type
> For mig vil det være unaturligt at ændre en type vha cascade update, der
> er ikke 100% kontrol med hvad der sker og ud fra et auditmæssigt synspunkt
> er det helt hen i hegnet at gøre det du gerne vil
>
Du er ude i noget dybt akademiske tågesnak om nogle, der ikke skal og
andre der måske skal have rettet type - hvad har det med sagen at gøre ?

I det konkrete tilfælde, hvor man retter et LAND skal alle FIRMAER og alle
AFD have rettet fremmednøglen (landet) og det er helt uden teoretisk og
praktiske
problemer - BORTSET fra, at MSSQL ikke kan implementere det på samme
elegante måde som det kan gøres i MS Access.

>> Ja, men det burde man overveje at implementere - man kunne spørge MS
>> Access
>> folkene, hvordan det skal laves og det kommer da nok på et tidspunkt.
>
> Der er ganske gode grunde til ikke at gøre det - jvf ovenfor
>
Vrøvl og sludder !

>>>Der er endnu flere ting et rigtigt rdbms kan som ikke Acces ikke evner
>>>og aldrig kommer til at kunne
>>
>> Muligt, men det er slet ikke emnet i denne tråd.
>>
> Næhh men det er hovedemnet i denne gruppe
>
> Hvordan gik det med det databaseskema så jeg kan sætte noget op mht
> triggers?
>
Her er tabellerne:

USE [TEST]
GO
/****** Object: Table [dbo].[FIRMA] Script Date: 02/18/2009 20:26:06
******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[FIRMA](
[FirmaId] [nvarchar](10) NOT NULL,
[LandId] [nvarchar](10) NOT NULL,
[Beskrivelse] [nvarchar](1000) NULL,
CONSTRAINT [PK_FIRMA] PRIMARY KEY CLUSTERED
(
[FirmaId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY =
OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[FIRMA] WITH CHECK ADD CONSTRAINT [FK_FIRMA_LAND]
FOREIGN KEY([LandId])
REFERENCES [dbo].[LAND] ([LandId])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[FIRMA] CHECK CONSTRAINT [FK_FIRMA_LAND]

USE [TEST]
GO
/****** Object: Table [dbo].[FIRMAAFD] Script Date: 02/18/2009 20:27:23
******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[FIRMAAFD](
[AfdId] [nvarchar](10) NOT NULL,
[AfdFirmaId] [nvarchar](10) NOT NULL,
[AfdLandId] [nvarchar](10) NOT NULL,
[BEskrivelse] [nvarchar](1000) NULL,
CONSTRAINT [PK_FIRMAAFD] PRIMARY KEY CLUSTERED
(
[AfdId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY =
OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[FIRMAAFD] WITH CHECK ADD CONSTRAINT [FK_FIRMAAFD_FIRMA]
FOREIGN KEY([AfdFirmaId])
REFERENCES [dbo].[FIRMA] ([FirmaId])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[FIRMAAFD] CHECK CONSTRAINT [FK_FIRMAAFD_FIRMA]
GO
ALTER TABLE [dbo].[FIRMAAFD] WITH CHECK ADD CONSTRAINT [FK_FIRMAAFD_LAND]
FOREIGN KEY([AfdLandId])
REFERENCES [dbo].[LAND] ([LandId])
GO
ALTER TABLE [dbo].[FIRMAAFD] CHECK CONSTRAINT [FK_FIRMAAFD_LAND]


USE [TEST]
GO
/****** Object: Table [dbo].[LAND] Script Date: 02/18/2009 20:27:45
******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[LAND](
[LandId] [nvarchar](10) NOT NULL,
[Beskrivelse] [nvarchar](1000) NULL,
CONSTRAINT [PK_LAND] PRIMARY KEY CLUSTERED
(
[LandId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY =
OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

og her er en trigger, hvor jeg forsøger af disable/enable relationen mellem
LAND og FIRMAAFD - med det kan ikke lade sig gøre:

USE [TEST]
GO
/****** Object: Trigger [dbo].[tgg_UpdateLand] Script Date: 02/18/2009
20:38:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[tgg_UpdateLand] ON [dbo].[LAND]

FOR UPDATE AS
BEGIN

ALTER TABLE FIRMAAFD NOCHECK CONSTRAINT FK_FIRMAAFD_LAND

IF UPDATE(LandID)
BEGIN

UPDATE FIRMAAFD SET FIRMAAFD.AfdLandID=inserted.LandID
FROM FIRMAAFD, deleted, inserted
WHERE deleted.LandID=FIRMAAFD.AfdLandID

END

ALTER TABLE FIRMAAFD CHECK CONSTRAINT FK_FIRMAAFD_LAND

END

Havde det været MS Access kunne man gøre følgende:

1) rette et land og det ville slå igennem på FIRMA og FIRMAAFD
2) slette et land og alle firmaer i dette land ville blive slettet og alle
afdelinger af disse firmaer ville blive slettet også
3) der kan ikke tilføjes en afdeling med et land, som ikke findes i tabellen
land (selvfølgelig skal firmaet også eksistere,
men det er relationen mellem LAND og FIRMAAFD, som er problemet)

Ka' du lave det er det fint.

Mvh KS


Peter Lykkegaard (07-03-2009)
Kommentar
Fra : Peter Lykkegaard


Dato : 07-03-09 20:54

KSsoerensen skrev

> I det konkrete tilfælde, hvor man retter et LAND skal alle FIRMAER og alle
> AFD have rettet fremmednøglen (landet) og det er helt uden teoretisk og
> praktiske problemer

Det vil give mening i min verden hvis man havde stavet "land" forkert oog
kun i det tilfælde

> Her er tabellerne:
>
Tak :)

> 1) rette et land og det ville slå igennem på FIRMA og FIRMAAFD
> 2) slette et land og alle firmaer i dette land ville blive slettet og alle
> afdelinger af disse firmaer ville blive slettet også

I de systemer jeg arbejder med til daglig skulle man så også slette alle
ordrer, fakturaer, kreditnotaer, varebevægelser oma for at beholde
dataintegriteten
Sletter jeg varebevægelser kommer min lagerbeholdning ud af trit med
virkeligheden
Giver det mere mening nu?

> 3) der kan ikke tilføjes en afdeling med et land, som ikke findes i
> tabellen land (selvfølgelig skal firmaet også eksistere,

Alm referentiel integritet, giver mening
I access har jeg typisk oprettet land (hvis den manglede) samtidig med at
firmaet blev oprettet

Skal triggeren kunne det samme?

> men det er relationen mellem LAND og FIRMAAFD, som er problemet)
> Ka' du lave det er det fint.
>
Jeg laver et udkast så må vi se hvordan det spiller sammen med din GUI
Jeg har til hensigt at bruge de nye try/catch blogge der er introduceret i
2005
Hvis det driller må vi tage den derfra :)

Der går lige nogle dage ...

Øh btw bruger du Access som frontend?

- Peter



KS (08-03-2009)
Kommentar
Fra : KS


Dato : 08-03-09 07:01

"Peter Lykkegaard" <plykkegaard@gmail.com> skrev i meddelelsen
news:49b2d0ef$0$90269$14726298@news.sunsite.dk...
> KSsoerensen skrev
>
>> I det konkrete tilfælde, hvor man retter et LAND skal alle FIRMAER og
>> alle
>> AFD have rettet fremmednøglen (landet) og det er helt uden teoretisk og
>> praktiske problemer
>
> Det vil give mening i min verden hvis man havde stavet "land" forkert oog
> kun i det tilfælde
>
>> Her er tabellerne:
>>
> Tak :)
>
>> 1) rette et land og det ville slå igennem på FIRMA og FIRMAAFD
>> 2) slette et land og alle firmaer i dette land ville blive slettet og
>> alle afdelinger af disse firmaer ville blive slettet også
>
> I de systemer jeg arbejder med til daglig skulle man så også slette alle
> ordrer, fakturaer, kreditnotaer, varebevægelser oma for at beholde
> dataintegriteten
> Sletter jeg varebevægelser kommer min lagerbeholdning ud af trit med
> virkeligheden
> Giver det mere mening nu?
>
Nu er alt jo ikke "sort eller hvidt" - det skal selvfølgelig i alle tilfælde
nøje
overvejes OM der skal være kaskadevis opdatering/sletning i en given
relation.

Men som MS udsendte deres eksempeldatabaser i starter - for 10-15 år siden -
var det UDEN - så hvis du sletted et ordrehoved/fakturahoved - ja, så lå
LINIERNE
stadig tilbage efter sletningen - og DET er helt "hen i hegnet" - og der var
masser
af andre tåbelige eksempler - desværre findes det stadig nogle tilfælde i
deres
Dynamics C5.

>> 3) der kan ikke tilføjes en afdeling med et land, som ikke findes i
>> tabellen land (selvfølgelig skal firmaet også eksistere,
>
> Alm referentiel integritet, giver mening
> I access har jeg typisk oprettet land (hvis den manglede) samtidig med at
> firmaet blev oprettet
>
> Skal triggeren kunne det samme?
>
Gerne for eksemplets skyld.

>
> Øh btw bruger du Access som frontend?
>
Jeg bruger noget lavet i C#, men denne DB er blot til test af
problematikken.

Mvh KS


Peter Lykkegaard (08-03-2009)
Kommentar
Fra : Peter Lykkegaard


Dato : 08-03-09 09:21

KSsoerensen skrev

> Men som MS udsendte deres eksempeldatabaser i starter - for 10-15 år
> siden -
> var det UDEN - så hvis du sletted et ordrehoved/fakturahoved - ja, så lå
> LINIERNE stadig tilbage efter sletningen

Det burde ikke være muligt slette ordrehovedet i det tilfælde aht
dataintegriteten

Det giver fint mening at linjerne skal slettes før man kan slette hele
ordren da disse måske ikke kan slettes aht andre relaterede data

- Peter



KS (08-03-2009)
Kommentar
Fra : KS


Dato : 08-03-09 12:16


"Peter Lykkegaard" <plykkegaard@gmail.com> skrev i meddelelsen
news:49b38001$0$90268$14726298@news.sunsite.dk...
> KSsoerensen skrev
>
>> Men som MS udsendte deres eksempeldatabaser i starter - for 10-15 år
>> siden -
>> var det UDEN - så hvis du sletted et ordrehoved/fakturahoved - ja, så lå
>> LINIERNE stadig tilbage efter sletningen
>
> Det burde ikke være muligt slette ordrehovedet i det tilfælde aht
> dataintegriteten
>
> Det giver fint mening at linjerne skal slettes før man kan slette hele
> ordren da disse måske ikke kan slettes aht andre relaterede data
>
> - Peter
Ja, men der var ingen test på hverken det ene eller det andet og linierne
lå tilbage uden "hoved" - noget rod !

Mvh KS


Leif Neland (11-03-2009)
Kommentar
Fra : Leif Neland


Dato : 11-03-09 12:30

KS <keld. skrev:
..
>
> Men som MS udsendte deres eksempeldatabaser i starter - for 10-15 år
> siden -
> var det UDEN - så hvis du sletted et ordrehoved/fakturahoved - ja, så lå
> LINIERNE
> stadig tilbage efter sletningen - og DET er helt "hen i hegnet" - og der
> var masser
> af andre tåbelige eksempler - desværre findes det stadig nogle tilfælde
> i deres
> Dynamics C5.

Man kan sige, at det korrekte i den virkelige verden ville være, at du
overhovedet ikke må kunne slette en faktura. Er fakturaen forkert, skal
der laves en kreditnota.

Eksempeldatabaser er kun eksempler, mange eksempler er uden fejlcheck og
andre ting, der er nødvendige i produktionskode, for ikke at gøre
eksemplet for uoverskueligt.

Leif

KS (26-03-2009)
Kommentar
Fra : KS


Dato : 26-03-09 20:20

"KS soerensen@os.dk>" <keld.<SLET_DETTE> skrev i meddelelsen
news:49b35f18$0$56767$edfadb0f@dtext02.news.tele.dk...
> "Peter Lykkegaard" <plykkegaard@gmail.com> skrev i meddelelsen
> news:49b2d0ef$0$90269$14726298@news.sunsite.dk...
>> KSsoerensen skrev
>>
>>> I det konkrete tilfælde, hvor man retter et LAND skal alle FIRMAER og
>>> alle
>>> AFD have rettet fremmednøglen (landet) og det er helt uden teoretisk og
>>> praktiske problemer
>>
>> Det vil give mening i min verden hvis man havde stavet "land" forkert oog
>> kun i det tilfælde
>>
>>> Her er tabellerne:
>>>
>> Tak :)
>>
>>> 1) rette et land og det ville slå igennem på FIRMA og FIRMAAFD
>>> 2) slette et land og alle firmaer i dette land ville blive slettet og
>>> alle afdelinger af disse firmaer ville blive slettet også
>>
>> I de systemer jeg arbejder med til daglig skulle man så også slette alle
>> ordrer, fakturaer, kreditnotaer, varebevægelser oma for at beholde
>> dataintegriteten
>> Sletter jeg varebevægelser kommer min lagerbeholdning ud af trit med
>> virkeligheden
>> Giver det mere mening nu?
>>
> Nu er alt jo ikke "sort eller hvidt" - det skal selvfølgelig i alle
> tilfælde nøje
> overvejes OM der skal være kaskadevis opdatering/sletning i en given
> relation.
>
> Men som MS udsendte deres eksempeldatabaser i starter - for 10-15 år
> siden -
> var det UDEN - så hvis du sletted et ordrehoved/fakturahoved - ja, så lå
> LINIERNE
> stadig tilbage efter sletningen - og DET er helt "hen i hegnet" - og der
> var masser
> af andre tåbelige eksempler - desværre findes det stadig nogle tilfælde i
> deres
> Dynamics C5.
>
>>> 3) der kan ikke tilføjes en afdeling med et land, som ikke findes i
>>> tabellen land (selvfølgelig skal firmaet også eksistere,
>>
>> Alm referentiel integritet, giver mening
>> I access har jeg typisk oprettet land (hvis den manglede) samtidig med at
>> firmaet blev oprettet
>>
>> Skal triggeren kunne det samme?
>>
> Gerne for eksemplets skyld.
>
>>
Er der nyt i denne sag ?

Mvh KS


KS (01-04-2009)
Kommentar
Fra : KS


Dato : 01-04-09 18:54


"KS soerensen@os.dk>" <keld.<SLET_DETTE> skrev i meddelelsen
news:49cbd581$0$56768$edfadb0f@dtext02.news.tele.dk...
> "KS soerensen@os.dk>" <keld.<SLET_DETTE> skrev i meddelelsen
> news:49b35f18$0$56767$edfadb0f@dtext02.news.tele.dk...
>> "Peter Lykkegaard" <plykkegaard@gmail.com> skrev i meddelelsen
>> news:49b2d0ef$0$90269$14726298@news.sunsite.dk...
>>> KSsoerensen skrev
>>>
>>>> I det konkrete tilfælde, hvor man retter et LAND skal alle FIRMAER og
>>>> alle
>>>> AFD have rettet fremmednøglen (landet) og det er helt uden teoretisk og
>>>> praktiske problemer
>>>
>>> Det vil give mening i min verden hvis man havde stavet "land" forkert
>>> oog kun i det tilfælde
>>>
>>>> Her er tabellerne:
>>>>
>>> Tak :)
>>>
>>>> 1) rette et land og det ville slå igennem på FIRMA og FIRMAAFD
>>>> 2) slette et land og alle firmaer i dette land ville blive slettet og
>>>> alle afdelinger af disse firmaer ville blive slettet også
>>>
>>> I de systemer jeg arbejder med til daglig skulle man så også slette alle
>>> ordrer, fakturaer, kreditnotaer, varebevægelser oma for at beholde
>>> dataintegriteten
>>> Sletter jeg varebevægelser kommer min lagerbeholdning ud af trit med
>>> virkeligheden
>>> Giver det mere mening nu?
>>>
>> Nu er alt jo ikke "sort eller hvidt" - det skal selvfølgelig i alle
>> tilfælde nøje
>> overvejes OM der skal være kaskadevis opdatering/sletning i en given
>> relation.
>>
>> Men som MS udsendte deres eksempeldatabaser i starter - for 10-15 år
>> siden -
>> var det UDEN - så hvis du sletted et ordrehoved/fakturahoved - ja, så lå
>> LINIERNE
>> stadig tilbage efter sletningen - og DET er helt "hen i hegnet" - og der
>> var masser
>> af andre tåbelige eksempler - desværre findes det stadig nogle tilfælde i
>> deres
>> Dynamics C5.
>>
>>>> 3) der kan ikke tilføjes en afdeling med et land, som ikke findes i
>>>> tabellen land (selvfølgelig skal firmaet også eksistere,
>>>
>>> Alm referentiel integritet, giver mening
>>> I access har jeg typisk oprettet land (hvis den manglede) samtidig med
>>> at firmaet blev oprettet
>>>
>>> Skal triggeren kunne det samme?
>>>
>> Gerne for eksemplets skyld.
>>
>>>
Hvorfor er alle de "skriftkloge" nu blevet så tavse ?

Mvh KS


Leif Neland (05-04-2009)
Kommentar
Fra : Leif Neland


Dato : 05-04-09 23:39

KS <keld. skrev:
>
> "KS soerensen@os.dk>" <keld.<SLET_DETTE> skrev i meddelelsen
> news:49cbd581$0$56768$edfadb0f@dtext02.news.tele.dk...
>> "KS soerensen@os.dk>" <keld.<SLET_DETTE> skrev i meddelelsen
>> news:49b35f18$0$56767$edfadb0f@dtext02.news.tele.dk...
>>> "Peter Lykkegaard" <plykkegaard@gmail.com> skrev i meddelelsen
>>> news:49b2d0ef$0$90269$14726298@news.sunsite.dk...
>>>> KSsoerensen skrev
>>>>
>>>>> I det konkrete tilfælde, hvor man retter et LAND skal alle FIRMAER
>>>>> og alle
>>>>> AFD have rettet fremmednøglen (landet) og det er helt uden
>>>>> teoretisk og praktiske problemer
>>>>

>>>>
> Hvorfor er alle de "skriftkloge" nu blevet så tavse ?
>
> Mvh KS
>

Jeg tror det er fordi du vil gøre noget, man "bare ikke gør".

Leif


KS (06-04-2009)
Kommentar
Fra : KS


Dato : 06-04-09 06:00

"Leif Neland" <leif@neland.dk> skrev i meddelelsen
news:49d93303$0$56782$edfadb0f@dtext02.news.tele.dk...
> KS <keld. skrev:
>>
>> "KS soerensen@os.dk>" <keld.<SLET_DETTE> skrev i meddelelsen
>> news:49cbd581$0$56768$edfadb0f@dtext02.news.tele.dk...
>>> "KS soerensen@os.dk>" <keld.<SLET_DETTE> skrev i meddelelsen
>>> news:49b35f18$0$56767$edfadb0f@dtext02.news.tele.dk...
>>>> "Peter Lykkegaard" <plykkegaard@gmail.com> skrev i meddelelsen
>>>> news:49b2d0ef$0$90269$14726298@news.sunsite.dk...
>>>>> KSsoerensen skrev
>>>>>
>>>>>> I det konkrete tilfælde, hvor man retter et LAND skal alle FIRMAER og
>>>>>> alle
>>>>>> AFD have rettet fremmednøglen (landet) og det er helt uden teoretisk
>>>>>> og praktiske problemer
>>>>>
>
>>>>>
>> Hvorfor er alle de "skriftkloge" nu blevet så tavse ?
>>
>> Mvh KS
>>
>
> Jeg tror det er fordi du vil gøre noget, man "bare ikke gør".
>
> Leif
Hvad er det du tro jeg vil gøre man "bare ikke gør" ?

Mvh KS


Leif Neland (06-04-2009)
Kommentar
Fra : Leif Neland


Dato : 06-04-09 11:56

>>>>>>
>>>>>>> I det konkrete tilfælde, hvor man retter et LAND skal alle
>>>>>>> FIRMAER og alle
>>>>>>> AFD have rettet fremmednøglen (landet) og det er helt uden
>>>>>>> teoretisk og praktiske problemer
>>>>>>
>>
>>>>>>
>>> Hvorfor er alle de "skriftkloge" nu blevet så tavse ?
>>>
>>> Mvh KS
>>>
>>
>> Jeg tror det er fordi du vil gøre noget, man "bare ikke gør".
>>
>> Leif
> Hvad er det du tro jeg vil gøre man "bare ikke gør" ?
>
Jeg har ikke lige det teoretiske udtryk i hovedet, men du vil lade en nøgle
bære en værdi i sig selv.

Du har en tabel med lande, firmaer og afdelinger.
Firmaer og afdelinger er tilknyttet landet.
Lad os antage at du har nøglen "Danmark", og vil ændre det til "Denmark",
det bliver du nødt til at "cascade"re til firma og afdeling.

Den "Korrekte" måde er at lade nøglen kun være en nøgle ind i
lande-tabellen.
Ideelt ved brugeren slet ikke hvad nøglen er, men ser f.ex. kun en pulldown.

Når du vil ændre stavemåden, rettes kun i landetabellen.

Evt kan man lade nøglen være ISO 3-Alpha, "DNK" eller UN/ISO 208, men det er
igen at lægge værdi i en nøgle.

Og, igen, man sletter ikke bare data; det kan ødelægge en masse historik og
konsistens.
Du vil slette et land, fordi du ikke vil handle med det.
Så du må slette firmaer og afdelinger, der hænger på det land.
Så må du slette fakturaer, order og leverancer, der er knyttet til de
firmaer.
Og så stemmer dit lager ikke mere.

Leif



KS (07-04-2009)
Kommentar
Fra : KS


Dato : 07-04-09 05:41

"Leif Neland" <leif@neland.dk> skrev i meddelelsen
news:49d9dfbd$0$90269$14726298@news.sunsite.dk...
>>>>>>>
>>>>>>>> I det konkrete tilfælde, hvor man retter et LAND skal alle
>>>>>>>> FIRMAER og alle
>>>>>>>> AFD have rettet fremmednøglen (landet) og det er helt uden
>>>>>>>> teoretisk og praktiske problemer
>>>>>>>
>>>
>>>>>>>
>>>> Hvorfor er alle de "skriftkloge" nu blevet så tavse ?
>>>>
>>>> Mvh KS
>>>>
>>>
>>> Jeg tror det er fordi du vil gøre noget, man "bare ikke gør".
>>>
>>> Leif
>> Hvad er det du tro jeg vil gøre man "bare ikke gør" ?
>>
> Jeg har ikke lige det teoretiske udtryk i hovedet, men du vil lade en
> nøgle bære en værdi i sig selv.
>
> Du har en tabel med lande, firmaer og afdelinger.
> Firmaer og afdelinger er tilknyttet landet.
> Lad os antage at du har nøglen "Danmark", og vil ændre det til "Denmark",
> det bliver du nødt til at "cascade"re til firma og afdeling.
Ja, og det er jo NETOP det man ikke kan på SQL-serveren - lav et tilsvarende
eksempel i MS Access - det kører UDEN problemer !
>
> Den "Korrekte" måde er at lade nøglen kun være en nøgle ind i
> lande-tabellen.
Det er jeg enig med dig i !

> Ideelt ved brugeren slet ikke hvad nøglen er, men ser f.ex. kun en
> pulldown.
Dette er jeg IKKE enig med dig i !
>
> Når du vil ændre stavemåden, rettes kun i landetabellen.
Det er jo præcis det jeg vil opnå !
>
> Evt kan man lade nøglen være ISO 3-Alpha, "DNK" eller UN/ISO 208,
Enig igen !
men det er igen at lægge værdi i en nøgle.
Enig, men uden praktisk betydning!

Resten er nogle forudsætninger, som DU lægger ind, OG som IKKE
er aktuelle i min situation.

> Og, igen, man sletter ikke bare data; det kan ødelægge en masse historik
> og konsistens.
> Du vil slette et land, fordi du ikke vil handle med det.
> Så du må slette firmaer og afdelinger, der hænger på det land.
> Så må du slette fakturaer, order og leverancer, der er knyttet til de
> firmaer.
> Og så stemmer dit lager ikke mere.
>
> Leif
>
>


Leif Neland (09-04-2009)
Kommentar
Fra : Leif Neland


Dato : 09-04-09 00:13

> "Leif Neland" <leif@neland.dk> skrev i meddelelsen
> news:49d9dfbd$0$90269$14726298@news.sunsite.dk...
>>>>>>>>
>>>>>>>>> I det konkrete tilfælde, hvor man retter et LAND skal alle
>>>>>>>>> FIRMAER og alle
>>>>>>>>> AFD have rettet fremmednøglen (landet) og det er helt uden
>>>>>>>>> teoretisk og praktiske problemer
>>>>>>>>
>>>>
>>>>>>>>
>>>>> Hvorfor er alle de "skriftkloge" nu blevet så tavse ?
>>>>>
>>>>> Mvh KS
>>>>>
>>>>
>>>> Jeg tror det er fordi du vil gøre noget, man "bare ikke gør".
>>>>
>>>> Leif
>>> Hvad er det du tro jeg vil gøre man "bare ikke gør" ?
>>>
>> Jeg har ikke lige det teoretiske udtryk i hovedet, men du vil lade en
>> nøgle bære en værdi i sig selv.
>>
>> Du har en tabel med lande, firmaer og afdelinger.
>> Firmaer og afdelinger er tilknyttet landet.
>> Lad os antage at du har nøglen "Danmark", og vil ændre det til
>> "Denmark", det bliver du nødt til at "cascade"re til firma og
>> afdeling.
> Ja, og det er jo NETOP det man ikke kan på SQL-serveren - lav et
> tilsvarende eksempel i MS Access - det kører UDEN problemer !
>>
>> Den "Korrekte" måde er at lade nøglen kun være en nøgle ind i
>> lande-tabellen.
> Det er jeg enig med dig i !
>
Jeg tror grunden til den larmende tavshed er, at ingen ser det som et
problem at man ikke kan lave den forkrøblede cascade-ændring i mssql, fordi
metoden du forsøger at få lavet er grundlæggende forkert.

Lav det rigtigt, og du har ikke problemet.

Eller lav det i applikationslaget, ikke i databasen.

Leif



>> Ideelt ved brugeren slet ikke hvad nøglen er, men ser f.ex. kun en
>> pulldown.
> Dette er jeg IKKE enig med dig i !
>>
>> Når du vil ændre stavemåden, rettes kun i landetabellen.
> Det er jo præcis det jeg vil opnå !

Så har jeg vist misforstået problemet, jeg troede du ville ændre nøglen i
alle tre tabeller.

Leif



Peter Lykkegaard (11-03-2009)
Kommentar
Fra : Peter Lykkegaard


Dato : 11-03-09 08:38

Leif Neland skrev

> Relationen B er overflødig, FIRMAAFD skal ikke have feltet LAND, når en
> afdeling hænger på et firma, der hænger på et land.

Det er noget vrøvl det forrige firma jeg arbejde i havde afdelinger
verden over
>
> Eller vil du kunne have at et firma i Norge har en afdeling i Sverige?

Det er ikke usandsynligt

- Peter

Søg
Reklame
Statistik
Spørgsmål : 177417
Tips : 31962
Nyheder : 719565
Indlæg : 6407870
Brugere : 218876

Månedens bedste
Årets bedste
Sidste års bedste