Avatar billede jobba Nybegynder
24. november 2003 - 15:30 Der 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.
Avatar billede dmk Nybegynder
25. november 2003 - 13:52 #1
Hvad med noget i stil med:

(
  exists (SELECT * FROM tblOSP where nr151X=[Reserveret bestillingsnr])
  or
  exists (SELECT * FROM tblRatstammer nr151X=[Reserveret bestillingsnr])
  or
  exists (SELECT * FROM tblPriotetsBlokke nr151X =[Reserveret bestillingsnr])
)
Avatar billede jobba Nybegynder
26. november 2003 - 08:08 #2
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

Så problemet er stadig ikke løst.
Avatar billede dmk Nybegynder
26. november 2003 - 16:05 #3
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

create table ....
[Reserveret bestillingsnr]  integer,
constraint check_exist check (
  CheckExists([Reserveret bestillingsnr])=1)


Det kunne jeg godt få til at virke.

/DMK
Avatar billede dmk Nybegynder
26. november 2003 - 16:07 #4
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 :-)
Avatar billede jobba Nybegynder
26. november 2003 - 16:48 #5
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 :-)
Avatar billede jobba Nybegynder
26. november 2003 - 16:49 #6
Jeg prøver lige at kigge på dit eksempel imorgen.... Indtil videre skal du have tak.
Avatar billede jobba Nybegynder
27. november 2003 - 11:39 #7
Jeg har fået oprettet funktionen:

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?
Avatar billede dmk Nybegynder
28. november 2003 - 14:36 #8
Åhh, SQL Server er lidt nærtagende på dette punkt. Når jeg kalder en funktion, skal jeg altid prefixe med dbo.

Så det hedder derfor ..... CHECK (DBO.CheckExists( ....


Det burde virke, hvis du har oprettet funktionen.
Avatar billede jobba Nybegynder
01. december 2003 - 08:30 #9
Mange tak for hjælpen!
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