Avatar billede Lasse Novice
09. august 2011 - 19:24 Der er 4 kommentarer og
1 løsning

check constraint efter setup

Hej

Jeg har en masse regler som jeg overholder via check constraints og triggers - jeg er ikke interesseret i en loesning via SP. Jeg har 3 tabeller f.eks.

Firmaer

Roller

BrugerRoller

I hvert firma, kan der vaere mange roller. I hver rolle kan der vaere mange brugere.

Der er nogle roller der kun kan indeholde et bestemt antal brugere. F.eks. "Ejer" skal indeholde 1 - 3, "Bogholder" skal indeholde 1.

Hvordan implementerer jeg disse regler? Mit foerste bud var at lave en trigger paa brugerroller der opdatere kolonne BrugerAntal i Roller. Ved brug af en constraint paa tabel Roller kan jeg sige at hvis RolleType = 1 (bogholder) og BrugerAntal != 1 => FEJL. Men dette vil ikke virke naar jeg kreerer et nyt firma, da BrugerAntal vil vaere 0. Hvad goer man her?
Avatar billede Lasse Novice
10. august 2011 - 01:32 #1
Jeg har fundet en anden loesning paa problemet. Lukker spg.
Avatar billede Syska Mester
10. august 2011 - 16:17 #2
Som er?

Kunne ske andre havde brug for det.
Avatar billede Lasse Novice
10. august 2011 - 18:41 #3
Jeg lavede om paa database strukturen. Jeg har adderet til kolonner til firma tabellen: 1 kolonne for "bogholder", 3 kolonner for "ejer". BrugerRoller tabellen bliver nu kun brugt til roller med uendelig antal brugere.

Dette er kun muligt i og med at antallet af kolonner der skal adderes er faa. Hvis antallet er stort, saa er spg stadig gyldigt.
Avatar billede Syska Mester
10. august 2011 - 23:40 #4
Ahhh.

Men tror ikke du kan løse det i databasen med mht til 1-3 ejere. Det ville nok være noget som skal ned i BL laget.

Selvom det ville være smart hvis det kunne håndteres af databasen, men som du selv er inde på, vil reglen ikke være opfyldt når et firma indsættes.

Men i hvert fald, hvis du finder en smart løsning som kan implementeres i databasen, så må du meget gerne poste det her.

mvh
Avatar billede Lasse Novice
11. august 2011 - 00:47 #5
Det kan lade sig goere via foelgende:
Adder 2 kolonner (min og maks for at undgaa hardcoding) til Roller. I insert trigger paa BrugerRoller, lav foelgende check:

if exists(

select roller.id,
      roller.min,
      roller.maks,
      count(distinct brugerroller.id)
from  inserted inner join
      roller inserted.RolleId = Roller.Id
group
by    roller.id
having count(distinct brugerroller.id) < roller.min or count(distinct brugerroller.id) > roller.maks)
begin
rollback
end

lav tilsvarende check paa delete triggeren.

Naar man indsaetter et firma skal man saa huske at addere nok brugerroller i een insert saetning saaledes at filteret ikke fejler :-)
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