MSSQL foreign key werkt niet op de juiste manier

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • mauricepwnd
  • Registratie: Juni 2010
  • Laatst online: 23-09 19:09
Hallo, voor mijn school ben ik bezig om een database te bouwen voor een veilingsite.

Nu heb ik een functie gemaakt die controleert of het nieuwe bod groter is dan het vorige bod en er moet een bepaalde grote tussen zitten, deze functie werkt:

CREATE function bodverhoging (@nieuwbod numeric(19,2), @vorigbod numeric(19,2))
RETURNS int
AS BEGIN
DECLARE @bool INT

SELECT @bool = CASE
WHEN @vorigbod >= 1 and @vorigbod < 50 and @nieuwbod - @vorigbod >= 0.5 THEN 1
WHEN @vorigbod >= 50 and @vorigbod < 500 and @nieuwbod - @vorigbod >= 1 THEN 1
WHEN @vorigbod >= 500 and @vorigbod < 1000 and @nieuwbod - @vorigbod >= 5 THEN 1
WHEN @vorigbod >= 1000 and @vorigbod < 5000 and @nieuwbod - @vorigbod >= 10 THEN 1
WHEN @vorigbod >= 5000 and @nieuwbod - @vorigbod >= 50 THEN 1
ELSE 0 END;
RETURN @bool

END

Nu wil ik een check uitvoeren met de volgende code waarin #euro het nieuwe bod bevat:

alter table Bod
add constraint chk_bodverhoging check (dbo.bodverhoging(#euro, dbo.Bieding(voorwerpnummer)) = 1)

Nu zou dit naar mijn idee moeten werken maar het houdt juist alles tegen

dit heb ik gebruikt als test

INSERT INTO [dbo].[Bod] ([#euro] ,[datum] ,[gebruikersnaam] ,[tijdsaanduiding] ,[voorwerpnummer])
VALUES (640, GETDATE(), 'Harry31', GETDATE() , 124)

Ik weet er geen raad meer mee en zit al een halve dag erop vast 8)7

Acties:
  • 0 Henk 'm!

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

Als je de eerste rij insert is er nog geen vorig bod, lijkt me dat je check dan FALSE teruggeeft.

Acties:
  • 0 Henk 'm!

  • mauricepwnd
  • Registratie: Juni 2010
  • Laatst online: 23-09 19:09
Als er nog geen vorig bod is dan geeft de functie het startbod mee

deze functie voert dit uit

ALTER FUNCTION [dbo].[Bieding] (@voorwerpnummer numeric(10))

RETURNS numeric(19,2)
AS
BEGIN
DECLARE @id AS numeric(19,2)
SELECT @id = startprijs from Voorwerp Where voorwerpnummer = @voorwerpnummer and dbo.Vorigbod(@voorwerpnummer) is null
if @id is null
BEGIN
SELECT @id = dbo.Vorigbod(@voorwerpnummer)
END
RETURN @id
END

sql resultaat

[ Voor 20% gewijzigd door mauricepwnd op 21-12-2015 15:13 ]


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
mauricepwnd schreef op maandag 21 december 2015 @ 15:01:
Als er nog geen vorig bod is dan geeft de functie het startbod mee
Oftewel in welke case valt hij dan?

Want dan geeft hij 0 terug en 0 != 1, dus oftewel hij wordt afgewezen.

Acties:
  • +2 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Dat inderdaad. Maar waarom zou je dit soort business logica in de database willen afhandelen? Of is dit een ongebruikelijk voorbeeld om iets over t-sql functies te leren?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 11-09 13:47

edeboeck

mie noow noooothing ...

pedorus schreef op maandag 21 december 2015 @ 23:04:
Dat inderdaad. Maar waarom zou je dit soort business logica in de database willen afhandelen? Of is dit een ongebruikelijk voorbeeld om iets over t-sql functies te leren?
QFT

Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

Volgens mij worden triggers (en check constrains?) in mssql uitgevoerd nadat het record is ingevoerd in de database. Daardoor levert denk ik vorig bod het huidinge bod denk ik.

Even afgezien dat dit in multiuser door sessie isolatie (ofwel:Je ziet de records van andere gebruikers niet tot de commit) helemaal de soep indraait.

Ofwel, die logica wil je ergnes anders neerzetten. (aandachspunt: locking!)

[ Voor 3% gewijzigd door leuk_he op 25-12-2015 12:33 ]

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.

Pagina: 1