|
| Kan man bare slette relationerne i DB? Fra : OZ |
Dato : 09-02-02 22:37 |
|
Hej NH
Jeg stødte på et sjovt dilemma her til aften, jeg har en count tabel der
samler oplysninger fra en asp side om hvor tit nyhederne fra en news tabel
ses/læses.
Når så nyheden på et tidspunkt slettes havde jeg lavet en trigger der gik i
funktion når nyheden slettes, således at alle forekomster i counter
tabellen slettes.
Men det var teorien, jeg stødte imidlertid ind i følgende problem, når min
trigger gik i funktion kom der en fejl meddelelse at den ikke kunne udføre
min trigger fordi der var konflikt i relationen mellem de to tabeller PK og
FK.....
Da gode råd var dyre og jeg ikke kunne se hvorfor der skulle opstå en
konflikt, ville jeg prøve at slette relationen i skræk for at det hele så
gik i stykker, men til min lettelse fandt jeg ud af at det faktisk virkede.
Nu kunne jeg slette min nyhed og min trigger slettede samtidigt alle
forekomster vedr. nyheden i min count tabel....
Så til mit spørgsmål:
I MS SQL 7 under diagrammer ses PK og FK (relationerne) mellem tabellerne,
kan man bare slette dem eller har de en reel funktion, min opfattelse har
altid været at de skulle være der og hvis ikke så virkede ingen ting mere.
Men efter min oplevelse her til aften ser det ud til at virke også uden??
Så hvad er rigtigt skal relationerne være der eller er de kun til for at
gøre det visuelt nemmere?
Håber der er nogen der kan svare !!
oz
| |
Jonas Sommer Nielsen (10-02-2002)
| Kommentar Fra : Jonas Sommer Nielsen |
Dato : 10-02-02 05:55 |
|
Hej OZ
Relationerne du laver i diagrammet bliver brugt for at fortælle serveren
hvilke relationer der er imellem tabellerne. Det er den eneste måde den kan
hjælpe dig med at holde styr på om der går noget galt. Og det er nettop
derfor at den holder op med at lave fejl når du sletter relationerne.
Anyway fejlen opstår formenligt pga. du forsøger at slette en post
indeholdende en PK hvor der i en anden tabel findes en post med en FK der
peger på denne. Hvis du gør det i den forkerte rækkefølge (altså ikke
sletter alle poster med FK der peger på din post med PK) så vil du få en
fejl pga. det "roder" tabellerne til.
Prøv om ikke du kan løse problemet rigtigt før du giver dig til at slette
dine relationer. Det vil formenligt kun give dig problemer senere. Da du
ellers resikere ikke at få ryddet ordenligt op.
Hygge
Hvid
| |
OZ (10-02-2002)
| Kommentar Fra : OZ |
Dato : 10-02-02 12:20 |
|
"Jonas Sommer Nielsen" <news@1d.dk> skrev:
> Relationerne du laver i diagrammet bliver brugt for at fortælle serveren
> hvilke relationer der er imellem tabellerne. Det er den eneste måde den
kan
> hjælpe dig med at holde styr på om der går noget galt. Og det er nettop
> derfor at den holder op med at lave fejl når du sletter relationerne.
>
> Anyway fejlen opstår formenligt pga. du forsøger at slette en post
> indeholdende en PK hvor der i en anden tabel findes en post med en FK der
> peger på denne. Hvis du gør det i den forkerte rækkefølge (altså ikke
> sletter alle poster med FK der peger på din post med PK) så vil du få en
> fejl pga. det "roder" tabellerne til.
>
> Prøv om ikke du kan løse problemet rigtigt før du giver dig til at slette
> dine relationer. Det vil formenligt kun give dig problemer senere. Da du
> ellers resikere ikke at få ryddet ordenligt op.
Hej =)
Tak for dit svar, det giver meget mening, det du siger.
Jammen jeg tror faktisk at jeg fandt løsningen p.b.a. det du skriver, jeg
trak min realtion den anden vej, altså fra en i newstabellen til mange i
countertabellen.... og nu ser det ud til at virke...
Tak for hjælpen, man kan ikke altid se skoven for bare træer..
Oz
| |
OZ (10-02-2002)
| Kommentar Fra : OZ |
Dato : 10-02-02 15:08 |
|
"OZ" <no_spam_gonzo@strike-team.com> skrev: i
> Hej =)
>
> Tak for dit svar, det giver meget mening, det du siger.
>
> Jammen jeg tror faktisk at jeg fandt løsningen p.b.a. det du skriver, jeg
> trak min realtion den anden vej, altså fra en i newstabellen til mange i
> countertabellen.... og nu ser det ud til at virke...
>
> Tak for hjælpen, man kan ikke altid se skoven for bare træer..
Nej, Nej nej.....
Det virker sk..... ikke alligevel, så snart der kommer data ind i min
counter tabel der relateres til new tabellen går det galt....... Men det kan
vel ikke gøres anderledes....
Min trigger ligger jo på News tabellen og er en delete trigger... men det er
nok her konflikten opstår at den ikke vil slette den fordi der findes
relationer til counter tabellen.... hmmm skal jeg flytte min delete trigger
til min counter tabel i stedet? det er vel et forsøg værd. Jeg syntes bare
ikke det er logisk....
Oz
| |
Stig Johansen (10-02-2002)
| Kommentar Fra : Stig Johansen |
Dato : 10-02-02 19:55 |
|
OZ wrote:
> "OZ" <no_spam_gonzo@strike-team.com> skrev: i
>
>> Hej =)
>>
>> Tak for dit svar, det giver meget mening, det du siger.
>>
>> Jammen jeg tror faktisk at jeg fandt løsningen p.b.a. det du skriver, jeg
>> trak min realtion den anden vej, altså fra en i newstabellen til mange i
>> countertabellen.... og nu ser det ud til at virke...
>>
>> Tak for hjælpen, man kan ikke altid se skoven for bare træer..
>
>
> Nej, Nej nej.....
>
> Det virker sk..... ikke alligevel, så snart der kommer data ind i min
> counter tabel der relateres til new tabellen går det galt....... Men det
> kan vel ikke gøres anderledes....
>
> Min trigger ligger jo på News tabellen og er en delete trigger... men det
> er nok her konflikten opstår at den ikke vil slette den fordi der findes
> relationer til counter tabellen.... hmmm skal jeg flytte min delete
Det er fordi triggeren først bliver udført EFTER din delete.
--
Med venlig hilsen / Best regards
Stig Johansen
| |
OZ (10-02-2002)
| Kommentar Fra : OZ |
Dato : 10-02-02 21:59 |
|
"Stig Johansen" <linux@w3data.dk> skrev:
> Det er fordi triggeren først bliver udført EFTER din delete.
Ok det er sandt nok, men hvordan gør jeg så? Findes der en before delete
trigger =)
Hvordan gør jeg så? Det virker jo hvis min relation er væk, men det er jo
klart nok...
Skal man så kalde en sp der deleter alle relationer i min counter tabel
inden den så sletter selve nyheden er det løsningen?
Jeg troede netop at en delete trigger var det man skulle bruge, men jeg
bliver vel klogere en dag.......
Oz
| |
Kristian Damm Jensen (13-02-2002)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 13-02-02 08:03 |
|
OZ wrote:
>
> "Stig Johansen" <linux@w3data.dk> skrev:
>
> > Det er fordi triggeren først bliver udført EFTER din delete.
>
> Ok det er sandt nok, men hvordan gør jeg så? Findes der en before delete
> trigger =)
Ja. I Oracle
> Hvordan gør jeg så? Det virker jo hvis min relation er væk, men det er jo
> klart nok...
> Skal man så kalde en sp der deleter alle relationer i min counter tabel
> inden den så sletter selve nyheden er det løsningen?
>
> Jeg troede netop at en delete trigger var det man skulle bruge, men jeg
> bliver vel klogere en dag.......
Det er desværre ikke muligt at implementere kaskade-sletning vha.
triggers, samtidig med at man holder fast i referenceintegriteten gennem
fremmednøgledefinitionen, af præcis den grund som Stig beskriver.
Der er to muligheder:
(1) Du sørger for at slette alle de referende poster *inden*.
(2) Du holder selv styr på reference-integriteten vha endnu flere
triggers.
Det første kræver lidt tænkearbejde, hvis du skal være sikker på at det
bliver gjort rigtigt hver gang. Det andet er bare et helvedes
kodearbejde. (Tro mig, jeg har arbejdet i versioner, hvor
referenceintegritet *kun* kunne implenteres vha. triggers.)
--
Kristian Damm Jensen | Feed the hungry at www.thehungersite.com
kristian-damm.jensen@cgey.dk | Two wrongs doesn't make a right,
ICQ# 146728724 | but three lefts do.
| |
Jonas Sommer Nielsen (13-02-2002)
| Kommentar Fra : Jonas Sommer Nielsen |
Dato : 13-02-02 10:14 |
|
Jeg sidder altså og bliver lidt i tvivl om hvor stort problemet er i dette
tilfælde. Det jeg har kunne læse mig frem til er at vi snakker om 2
tabeller. En news tabel og en count tabel. Count tabellen har blot en
referance til news tabellen (hvor news indeholder en pk der bliver refereret
til....)
Ergo får du en OZ en fejl hvis/når han forsøger at slette noget i news
tabellen hvis han ikke først har slettet alle poster i count tabellen der
peger på den post i news han vil slette.
Er min antagelse helt forkert?
Hvis det ikke er helt vedsiden af, er jeg samtidig lidt i tvivl om hvorfor
problemet med at få ryddet disse få poster af vejen i den rigtige rækkefølge
så stort?
Om ikke andet ville en simpel løsning simpelthen være at gøre det fra asp
laget. Jeg forestiller mig at du, her sidder med et id på den nyhed du gerne
vil have slettet. Og at det
formenligt er præcist samme id der bliver refereret til i count tabellen.
If so... så kan du simpelt hen starte med at nuke posten/posterne i count
tabellen via en simpelt sql sætning og straks efterfølgende slette news
posten.
(dette er selfølgelig kun nødløsingen da den har visse problemer Performance
mæssigt, sikkerheds mæssigt osv. Men i praksis vil det formenligt virke fint
i dit tilfælde)
Dog bør du jo selfølgelig altid strebe efter kun at have et kald fra asp
laget til databasen når du lave den slaks.
Anyway .. hvis jeg er helt forkert på den så slår i mig bare.
Hygge
Hvid
| |
Peter Lykkegaard (13-02-2002)
| Kommentar Fra : Peter Lykkegaard |
Dato : 13-02-02 11:54 |
|
"Jonas Sommer Nielsen" <news@1d.dk> wrote in message
news:a4daoj$2k0v$1@news.cybercity.dk...
> Jeg sidder altså og bliver lidt i tvivl om hvor stort problemet er i dette
> tilfælde. Det jeg har kunne læse mig frem til er at vi snakker om 2
> tabeller. En news tabel og en count tabel. Count tabellen har blot en
> referance til news tabellen (hvor news indeholder en pk der bliver
refereret
> til....)
>
Diskussionen er vist blevet en mere generel betragtning end en løsning på
sletning i to releaterede tabeller
>
> Om ikke andet ville en simpel løsning simpelthen være at gøre det fra asp
> laget...
> Anyway .. hvis jeg er helt forkert på den så slår i mig bare.
Det vil sige du vil lave to (eller flere) kald for at slette noget så
"enkelt"?
Du kan godt gøre fra dit script uden at lave en SP
ex
DELETE FROM tblCount WHERE NewsID = 1
DELETE FROM tblNews WHERE NewsID = 1
Evt
DECLARE @CountID Int
DECLARE @NewsID Int
DECLARE @CountID Int
SET @NewsID = NewsID FROM tblCount WHERE CountID = @ID
DELETE FROM tblCount WHERE CountID = @ID
IF NOT EXISTS (
SELECT NewsID FROM tbCount WHERE NewsID = @NewsID
)
BEGIN
DELETE FROM tblNews WHERE NewsID = @NewsID
END
Dette er også noget lignende man ville lave i en trigger for at implementere
kaskadevis sletning
mvh/Peter Lykkegaard
| |
OZ (13-02-2002)
| Kommentar Fra : OZ |
Dato : 13-02-02 17:11 |
|
"Peter Lykkegaard" <polonline@hot.mail.com> skrev:
> Det vil sige du vil lave to (eller flere) kald for at slette noget så
> "enkelt"?
> Du kan godt gøre fra dit script uden at lave en SP
>
> ex
> DELETE FROM tblCount WHERE NewsID = 1
> DELETE FROM tblNews WHERE NewsID = 1
>
> Evt
> DECLARE @CountID Int
> DECLARE @NewsID Int
>
> DECLARE @CountID Int
> SET @NewsID = NewsID FROM tblCount WHERE CountID = @ID
>
> DELETE FROM tblCount WHERE CountID = @ID
> IF NOT EXISTS (
> SELECT NewsID FROM tbCount WHERE NewsID = @NewsID
> )
> BEGIN
> DELETE FROM tblNews WHERE NewsID = @NewsID
> END
>
Hej igen =)
Ja jeg takker og bukker mange gange for al den response jeg har fået, jeg er
lige nu selv lidt meget forvirret =(
Det var sku meget nemmere i ACCESS =), men nu er jeg jo ved at konvertere så
der er vel ingen vej uden om....
Jeg kan slet ikke gennemskue det mere, måske jeg skulle holde en pasue for i
dag =(
Når du skriver at jeg sagtens kan gøre det fra mit script uden brug af en
SP mener du så via min DELETE TRIGGER eller er jeg helt ved siden af?
Hvis der er nogen der har et nemt eksempel på en Cacade delete og en cascade
update trigger ville det være "nice", bare for at se hvordan syntaxen er,
jeg vil helst undgå at slette mine relationer da de jo har en mening.
På forhånd tak.
Oz
| |
Peter Lykkegaard (13-02-2002)
| Kommentar Fra : Peter Lykkegaard |
Dato : 13-02-02 17:54 |
|
"OZ" <no_spam_gonzo@strike-team.com> wrote in message
news:a4e32b$s5e$1@sunsite.dk...
> Når du skriver at jeg sagtens kan gøre det fra mit script uden brug af en
> SP mener du så via min DELETE TRIGGER eller er jeg helt ved siden af?
Nej, du kan bruge T-SQL direkte i dine scripts uno problemos
>
> Hvis der er nogen der har et nemt eksempel på en Cacade delete og en
cascade
> update trigger ville det være "nice", bare for at se hvordan syntaxen er,
> jeg vil helst undgå at slette mine relationer da de jo har en mening.
>
Kik lidt på Create Trigger i Books Online
Så jeg vil se om jeg kan brygge noget sammen
mvh/Peter Lykkegaard
| |
OZ (13-02-2002)
| Kommentar Fra : OZ |
Dato : 13-02-02 20:47 |
|
"Peter Lykkegaard" <polonline@hot.mail.com> skrev:
> Kik lidt på Create Trigger i Books Online
> Så jeg vil se om jeg kan brygge noget sammen
Hej Peter
Tak!
Jeg kom til at tænke på en anden måde at omgå trigger løsningen på, men har
brug for lidt hjælp hertil:
1. At skrive en SP for alle relationer der sletter ind i tabeller hvor der
er refferencer, det vil jeg tro jeg ville kunne finde ud af, men det er
meget arbejde for at slette en ting, men hvad gør man ikke for at bevare
refferentiel integritet.
2. At skrive en SP der gør ovenstående blot i en SP, det ved jeg ikke om er
muligt og hvis det er hvordan gør man?
3. En trigger løsning som jeg ingen ide har til hvordan jeg skal få til at
du fordi den normale måde at gøre det på syntes jeg ikke jeg kan få til at
virke, her opstår netop PK/FK problematikken....
Kan man f.eks. sammenskrive disse to SP til en? Så ville jeg eks kunne
slette Category før jeg sletter Selve nyheden men hvordan gør man det, jeg
har løst i booksonline men syntes ikke jeg kan finde det.
CREATE PROCEDURE news_delete
(@NewsID int)
AS DELETE News
WHERE
( NewsID = @NewsID)
CREATE PROCEDURE category_delete
(@CatID int)
AS DELETE Category
WHERE
( CatID = @CatID)
Men hvilken løsning er bedst? Det er vel trigger løsningen eller??
På forhånd tak
Oz
| |
OZ (13-02-2002)
| Kommentar Fra : OZ |
Dato : 13-02-02 21:49 |
|
"OZ" <no_spam_gonzo@strike-team.com> skrev:
> Kan man f.eks. sammenskrive disse to SP til en? Så ville jeg eks kunne
> slette Category før jeg sletter Selve nyheden men hvordan gør man det, jeg
> har løst i booksonline men syntes ikke jeg kan finde det.
>
> CREATE PROCEDURE news_delete
> (@NewsID int)
> AS DELETE News
> WHERE
> ( NewsID = @NewsID)
>
> CREATE PROCEDURE category_delete
> (@CatID int)
> AS DELETE Category
> WHERE
> ( CatID = @CatID)
Ok måske en løsning, men er trigger løsningen ikke den bedste måde, hvad
siger du?
CREATE PROCEDURE komplet_delete
@NewsID int
AS
BEGIN
EXEC category_delete @NewsID --Refferance sletning til category tabellen
EXEC count_delete @NewsID --Refferance sletning til count tabellen
EXEC news_delete @NewsID --Sletning af nyheden
END
oz
| |
Nis Jorgensen (11-02-2002)
| Kommentar Fra : Nis Jorgensen |
Dato : 11-02-02 11:42 |
|
On Sun, 10 Feb 2002 15:08:21 +0100, "OZ"
<no_spam_gonzo@strike-team.com> wrote:
>"OZ" <no_spam_gonzo@strike-team.com> skrev: i
>
>> Hej =)
>>
>> Tak for dit svar, det giver meget mening, det du siger.
>>
>> Jammen jeg tror faktisk at jeg fandt løsningen p.b.a. det du skriver, jeg
>> trak min realtion den anden vej, altså fra en i newstabellen til mange i
>> countertabellen.... og nu ser det ud til at virke...
>>
>> Tak for hjælpen, man kan ikke altid se skoven for bare træer..
>
>
>Nej, Nej nej.....
>
>Det virker sk..... ikke alligevel, så snart der kommer data ind i min
>counter tabel der relateres til new tabellen går det galt....... Men det kan
>vel ikke gøres anderledes....
>
>Min trigger ligger jo på News tabellen og er en delete trigger... men det er
>nok her konflikten opstår at den ikke vil slette den fordi der findes
>relationer til counter tabellen.... hmmm skal jeg flytte min delete trigger
>til min counter tabel i stedet? det er vel et forsøg værd. Jeg syntes bare
>ikke det er logisk....
Nu kender jeg mest til Access, men kan du ikke saette en Cascade
Delete paa "relationen" i MS SQL? Saa skulle du ganske slippe for at
rode med triggere og SP'er.
--
Nis Jorgensen
Amsterdam
Please include only relevant quotes, and reply below the quoted text. Thanks
| |
|
|