|  | 		    
					
        
         
          
         
	
          | |  | 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
 
 
 |  |  | 
 |  |