09. august 2011 - 19:24Der 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?
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.
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 :-)
Synes godt om
Ny brugerNybegynder
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.