Avatar billede hulla Novice
10. februar 2003 - 16:02 Der er 20 kommentarer og
1 løsning

Constraints eller hvad ??

Jeg har 2 tabeller: Main og ForSale.

I Main har jeg en feltværdi der kan være enten 1 eller 0. Den hedder SetForSale.
I tabellen ForSale oprettes poster på samme tid som feltet SetForSale bliver sat til 1.

Mit problem er, at det er muligt f.eks. at gå direkte på DB og sætte SetForSale til 1 uden at oprette noget i ForSale.

Kan man ikke lave en constraint eller lignende der forhindrer at det overhovedet er muligt?
Eller er det en Trigger ???
Avatar billede janus_007 Nybegynder
13. februar 2003 - 23:52 #1
jo da.. sføli kan det lade sig gøre. Det du skal lave er "referential integritet" igennem foreign key og og check constraints!

Hvis du ikke lige kan gennemskue hvordan det gøres så skriv igen :O)
Avatar billede hulla Novice
14. februar 2003 - 15:24 #2
jeg kan nok ikke helt gennemskue det janus :o)
Avatar billede hulla Novice
18. februar 2003 - 09:04 #3
Gider du ikke fortælle mig det ?  :o)
Avatar billede janus_007 Nybegynder
18. februar 2003 - 09:36 #4
jo sføli... Var bare lkige kommet helt væk fra spørgsmålet hehe...

Åben din SQL EnterpriseManager, vælg tabellen ForSale, højreklik vælg Design, højreklik på et feltnavn, vælg properties, vælg fanebladet Relationships, tryk New, sæt primary key table til ForSale og Foreign key til Main, sæt flueben i Cehck existing data on creation!

Det skulle være det...
Avatar billede hulla Novice
24. februar 2003 - 13:24 #5
Jeg skal jo også vælge et feltnavn under key tables, og det jeg egentlig gerne vil, er jo at altid have et 1-tal i SetForSale FELTET i Main, hvis emnet eksisterer i ForSale tabellen.

Det er jo ikke det jeg gør med et alm. relationship,.eller ???
Avatar billede hulla Novice
24. februar 2003 - 13:26 #6
faktisk må det gerne være sådan at hvis værdien i SetForSale bliver ændret fra 1 til 0, så slettes emnet automatisk i ForSale tabellen
Avatar billede janus_007 Nybegynder
24. februar 2003 - 14:07 #7
Jo du skal bare lave det med en computed column...

Jeg kunne lige poste et eksempel!
Avatar billede janus_007 Nybegynder
24. februar 2003 - 14:27 #8
hmmm, næh det kan man åbenbart ikke på tværs af tabeller :O(

Du må lave en relation imellem de 2 tabeller evt. vha. et id og på den måde sikre at der ikke kan oprettes et produkt i SetForSale uden selve produktet eksisterer i ForSale.

Jeg vil gerne hjælpe mere, men jeg mangler noget info. Hvad er det med de 2 tabeller, hvad skal den ene og den anden bruges til ?
Avatar billede hulla Novice
24. februar 2003 - 14:37 #9
Det med 1 eller 0 er bare en hurtig måde at checke om et bestemt emne er tilsalg, og den anden tabel indeholder oplysninger om pris og den slags..

Jeg er ved at rode med Triggers, jeg tror det er løsningen, men de gør ikke som de skal :o) Kender du noget til det ?
Avatar billede janus_007 Nybegynder
24. februar 2003 - 15:22 #10
Ja jeg kender såmænd også til triggers...


Men er det nemmeste ikke bare at selecte direkte i tabellen og se om produktet er til salg eller ej?? - Istedet for at have en anden tabel til styring... Det er lidt svært for mig lige at ha det store overblik :O)
Avatar billede hulla Novice
24. februar 2003 - 15:31 #11
Det er muligt du har ret, men nu har jeg sat mig for at finde ud af hvordan man styrer det,.kan være man får brug for det senere ;o)

Jeg kan godt få en trigger til at slette alt i min tabel, men når jeg forsøger at bruge Where klausuler med en anden tabel går det galt..
Kan man ikke joine flere tabeller i en trigger ?
Avatar billede janus_007 Nybegynder
24. februar 2003 - 15:38 #12
Post din trigger :O)
Avatar billede hulla Novice
24. februar 2003 - 15:53 #13
CREATE TRIGGER [ForSaleCheck] ON [dbo].[ItemsForSale]
FOR INSERT, UPDATE, DELETE
AS
DELETE FROM [dbo].[ItemsForSale]

Indtil videre virker det ..

Men jeg vil gerne have fortalt den at det kun gælder for dem hvor dbo.Main.ForSale = 0
Avatar billede hulla Novice
25. februar 2003 - 09:10 #14
KAn man ikke joine 2 tabeller i en trigger ?
Avatar billede janus_007 Nybegynder
25. februar 2003 - 09:25 #15
Jo det kan man snildt! Ingen problemer der :O)
Avatar billede hulla Novice
25. februar 2003 - 09:26 #16
øhhh hvordan ?
Avatar billede janus_007 Nybegynder
25. februar 2003 - 09:28 #17
CREATE TRIGGER trig_name
ON TABLE table_name
FOR UPDATE
AS
IF UPDATE(field1)
  UPDATE table_name
  FROM table_name
  INNER JOIN deleted d ON table_name.key1 = d.key1 --AND table_name.key2 = d.key2 ...
  WHERE table_name.field1 = 'Y' AND d.field1 <> 'Y'

noget ala det...
Avatar billede hulla Novice
25. februar 2003 - 09:44 #18
Det forstår jeg vist ikke helt :o)

Hvad er deleted ?? hvorfor skal man skrive både UPDATE table_name og FROM table_name? hvad er key1 og 2 ?
Avatar billede hulla Novice
25. februar 2003 - 10:08 #19
Du skal nok få ekstra point :o)
Avatar billede janus_007 Nybegynder
25. februar 2003 - 10:36 #20
jo, deleted er den record som bliver slettet, i ovenstående får den tablealias d, denne deleted må nødvendigvis også ha en relation til en anden tabel når der skal joines. Det kan jo enten være i form af en primary key (hvilket er at foretrække), eller bare join på et andet ikke indexeret column. (derfor key1 og key2... det skal bare forståes som join nøgler)
Mht. update, så ville du jo gerne have at Main.dbo.SetForSale blev sat til 0 når produktet blev slettet i ForSale!!
Avatar billede hulla Novice
26. februar 2003 - 08:17 #21
nej ikke helt sådan,..jeg vil gerne have at når ForSale i main bliver sat til 0, slettes emnet automatisk i ItemsForSale.

Når jeg normalt joiner ser det da sådan her ud:

dbo.Main INNER JOIN dbo.Models ON dbo.Main.ModelID = dbo.Models.ID

Der bruger jeg da ikke dine Key ???
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