24. november 2003 - 15:30Der er
8 kommentarer og 1 løsning
Check constraint
Hvad er der galt med denne check constraint. Enterprise Manager melder fejlen: Error validating constraint!
([Reserveret bestillingsnr] IN (SELECT nr151X FROM tblOSP)) OR ([Reserveret bestillingsnr] IN (SELECT nr151X FROM tblRatstammer)) OR ([Reserveret bestillingsnr] IN (SELECT nr151X FROM tblPriotetsBlokke))
Forklaring: Der skal tjekkes på data ved INSERT/UPDATE. Der tjekkes på om feltet [Reserveret bestillingsnr] også er tilgængelige i en af 3 andre tabeller i den primære nøgle [nr151X].
Er det bare en ganske enkelt syntax fejl? Måske skulle der bare laves nogle andre relationer imellem tabellerne... hvordan ved jeg bare ikke.
( exists (SELECT * FROM tblOSP where nr151X=[Reserveret bestillingsnr]) or exists (SELECT * FROM tblRatstammer nr151X=[Reserveret bestillingsnr]) or exists (SELECT * FROM tblPriotetsBlokke nr151X =[Reserveret bestillingsnr]) )
Jeg omskrev den lidt, men kunne ikke få den til at virke. (exists (SELECT * FROM tblOSP WHERE nr151X = [Bestilling af prototyper].[Reserveret bestillingsnr])) or (exists (SELECT * FROM tblRatstammer WHERE nr151X = [Bestilling af prototyper].[Reserveret bestillingsnr])) or (exists (SELECT * FROM tblPriotetsBlokke WHERE nr151X = [Bestilling af prototyper].[Reserveret bestillingsnr]))
Hvis jeg brugte sætningen i en SELECT statement, så virkede den fint. Jeg tilføjede bare denne sætning i i starten: SELECT * FROM [Bestilling af prototyper] WHERE
Jeg prøvede lige at efterligne dit scenarie, og fik af vide, at jeg ikke kunne lave en sub-select i en check-constraint.
Det du så kan gøre i stedet, er at lave en check-funktion, som du kan kalde fra din constraint:
create function CheckExists (pID integer) returns integer as begin if exists ( SELECT * FROM tblOSP WHERE nr151X = [Bestilling af prototyper].[Reserveret bestillingsnr] ) or exists ( .... ) return 1; return 0; end
Jeg syntes i øvrigt generelt det er en rigtig dårlig ide at benytte sig af felt- og tabel-navne med mellemrum, samt benytte reserverede ord. Det gør det meget sværre at skrive SQL, meget sværre at læse SQL og meget sværre at porte til en anden database.
Men det er religion, og du må naturligvis gøre som du lyster :-)
Angående det med navngivning, så har jeg desværre ikke valgt de navne. Ellers var det også blevet anderledes. Det er en database som er upsized fra Access, og det er en lærling som har navngivet tabellerne i Access. Jeg mener også at du har fuldt ret. Men da MS-SQL understøtter samme navngivning af objecter som Access, så går det da ikke helt galt :-)
create function CheckExists(@nr nvarchar(8)) returns integer as begin if exists (SELECT * FROM tblOSP WHERE nr151X = @nr) OR exists (SELECT * FROM tblRatstammer WHERE nr151X = @nr) or exists (SELECT * FROM tblPriotetsBlokke WHERE nr151X = @nr) return 1; return 0; end
Men når jeg kører denne statement, så går det galt: ALTER TABLE [bestilling af prototyper] ADD CONSTRAINT check_exists CHECK (CheckExists([Reserveret bestillingsnr])=1)
Fejlmeddelse: Server: Msg 195, Level 15, State 10, Line 2 'CheckExists' is not a recognized function name.
Jeg ved ikke helt hvad der sker for den, da enterprise manager viser at funktionen er der. Har du et løsningsforslag?
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.