30. september 2004 - 22:11Der er
5 kommentarer og 1 løsning
Hvordan fungerer en triggers timing?
Hej.
Jeg er helt groen mht triggers, saa i maa lige baere over med mine knap saa intelligente spg.
Jeg skal have lavet et logge system paa en allerede eksisterende db. Som det er nu, saa sker alle aendringer i db'en via SP, og det ville vaere forholdsvis nemt at laegge logningen i disse SP'er. Jeg kunne nu godt taenke mig at goere det via triggers, da det er nemmere at vedligeholde pga der findes ca 50 SP'er (som vedroerer de ting der skal logges paa) man kun 2 tabeller jeg skal logge paa. Dvs. 2 triggers i forhold til 50 aendringer!
Min ide er at jeg med en trigger kigger paa det som er aendret ved update/insert). Jeg skriver saa en lille tekst i en logtabel over hvad der er sket. Denne lille ting har jeg fundet ud af kan goeres ved at kigge paa tabellerne inserted og deleted i triggeren.
Det er nu ikke nok med en lille tekst i min logtabel, jeg kunne ogsaa godt taenke mig at vide hvilken person der staar for aendringen. Alle SP'er kommer med parameteren IdLogin. Denne kunne jeg forestille mig at jeg skulle gemme i en temptabel. Naar triggeren fyres af, saa skal jeg hente denne IdLogin til brug ved indsaettelse i logtabellen.
Ja, nu kommer saa det egentlige problem. Hvornaar fyres triggerne af? Mine problemer gaar ud paa at hvad hvis 2 personer fyrer en sp af paa samme tid, vil der saa komme 2(evt flere) IdLogins i denne tabel, og hvordan kan jeg vide hvilken jeg skal vaelge... Findes der noget sessionId, eller hvad kan jeg goere ved dette...
Er der evt en anden smartere maade jeg kunne loese dette paa?
1) Person kalder SP1(stored procedure). Denne SP indsaetter personens ID i prelogtabel. Derefter aendrer SP1 noget i tabelMedTrigger1.
2) Aendringen fra SP1 i tabelMedTrigger1 goer at en trigger bliver fyret af. Triggeren kigger i prelogtabel efter det ID som har lavet aendringer. Med det ID indsaetter triggeren noget i logtabel.
Mit problem er ... Hvad hvis 2 personer paa samme tid kalder SP1. Vil der da saa komme 2 ID i prelogtabel? Det medfoerer jo at triggeren paa en eller anden maade skal bestemme sig for hvilken af de 2 den skal vaelge. Hvordan kan jeg vide hvilken en? Kan jeg evt. indsaette et timestamp i prelogtabel og tage det aeldste ID?
Er der ikke mulighed for, at du kan bruge integreret sikkerhed el.lign. således at dine brugere logger direkte på din database ? Det vil lette mange af dine problemer, idet du så bare i din trigger kan bruge variablen system_user, der angiver den nuværende bruger.
Alternativt vil jeg foreslå dig at bruge transaktioner.
Der er flere måder at løse din opgave på, men det du selv er inde på er nu ikke så dumt rent vedligeholdelsesmæssigt. Veronicas løsning er sådan set også fin hvis alle brugte EM eller QA direkte, men igennem en applikation vil system_user blot være den account der er granted logon til eks.vis ASP_NET eller hvad ved jeg.
Der findes AFTER og INSTEAD OF triggers, du vil sikkert bruge AFTER i denne sammenhæng og den bliver fired kun hvis alle operationerne er succesfulde og garantien er at den altid bliver udført sekventielt. Dvs. du kan stole på at den fyres af lige bagefter tabel updates/ deletes osv. Herfor kan du eks.vis indsætte dit IdLogins i tabellen der ændres i og hente dette ud igen igennem din trigger og logge at IdLogins har lavet de og de ændringer...
Jeg har brugt veronicas loesning... Alligevel vil jeg ogsaa give lidt point til janus007. Saa hvis du lige svarer veronica, saa kommer der nogen point.
ok, pointene er dine janus_007, eftersom veronica ikke svarer
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.