Avatar billede bba Nybegynder
29. januar 2004 - 11:09 Der er 5 kommentarer og
1 løsning

Time felt trigger

Hvorledes laves en trigger funktion når et dato/tids felt antager
dags dato og tid.

Eksempel feltet time_to_do_event indeholder '200412121012'

triggeren skal startes når det angivne timestamp = nu ??

Funktionen skal kalde en ekstern applikation og parse data i den pågældende match ??

Jeg benytter perl som scriptsprog, hvis funktionen kan laves simpelere herfra ??

Mvh, BBA
Avatar billede trer Nybegynder
29. januar 2004 - 13:36 #1
Et groft udkast er

create trigger mytrigger on mytable
for insert, update
as
begin
  if exists( select 1 from inserted where time_to_do_event = getdate() ) begin
    exec xp_cmdshell 'dosomething.exe'
  end
end

det her vil kun virke korrekt ved en enkelt match. indsættes flere rækker i en operation skal det laves som en cursor i stedet.

Men hvad skal der parses? Det er højt sandsynligt mere effektivt og driftssikkert at parse dine data direkte i SQL Server fremfor at kalde et externt program fra en trigger.
Avatar billede bba Nybegynder
29. januar 2004 - 13:51 #2
Trer

Tak for hurtig response !!

Vil det sige at hvis recorden er indtastet for 14 dage siden uden opdateringer, men datofelt til d.d. vil den automatisk blive trigget, uden der har været hændelser i DB ??
Det der skal parses til eksternt script er alle data i den pågælgælden matchende record.

Funktionen skal benyttes til afsendelse af SMS beskeder i scedule funktion, altså beskeder der ønskes afsendt på et foruddefineret tidspunkt.

Scriptet der kaldes sørger for afsendelse og hvis det går godt sættes statusflag i DB for OK ellers retry.

Dvs. trigger skal matche d.d. og tid samt have status "undelivered"

Holder din trigger forslag til dette ??

Mvh, BBA
http://www.email2sms.dk
Avatar billede trer Nybegynder
29. januar 2004 - 14:06 #3
Nixen, sådan fungerer en trigger desværre ikke.

Triggeren kaldes umiddelbart i transaktionen der opdaterer data - den lagrer ikke en oplysning om, at om X antal dage skal noget ske.

Hvis du gerne vil have en sådan funktion, så er nemmeste løsning at schedulere et job til, f.eks. hver hele time, at løbe dine data gennem og kalde scriptet.

SQL Koden i jobbet kan se sådan ud:

declare @besked varchar(160), @telefonnr varchar(20)
declare crsr cursor local fast_forward for
  select besked, telefonnr
  from data
  where time_to_do_event = getdate()
  and status='undelivered'

open crsr
fetch next from crsr
into @besked, @telefonnr
while @@fetch_status=0 begin
  exec xp_cmdshell 'sendbesked '+@besked+' '+@telefonnr
  /* Håndter returværdi her  - noget i stil med
  if @rv = 0 then begin
    update data set status='delivered'
    where besked=@besked and telefonnr=@telefonnr
  end
  */
  fetch next from crsr
  into @besked, @telefonnr
end
close crsr
deallocate crsr

jeg har ikke lige check på, om du kan aflæse en returværdi fra et ekstern program - muligvis står noget i Books Online i forbindelse med xp_cmdshell ?

en anden ting - som jeg har skrevet select'en så skal tidspunktet matche pr milisekund.  Der skal lige sikres at dit timestamp kan matches op mod getdate().

Dato-konverteringsfunktionerne i SQL Server er ret begrænsede. Du kan finde dem i Books Online under CONVERT()

jeg har desværre ikke mere tid lige nu - vil være på i aften igen, håber ovenstående kan sætte dig igang.
Avatar billede bba Nybegynder
29. januar 2004 - 14:13 #4
Trer

Jeg har accepteret dit svarfor hurtig response.

Jeg tænkte det nok, at trigger ikke fungerede sådanne.

Jeg laver et script der for hvert minut fetcher alle for den pågældende dag, og
lægger dem i et array i min kode for derefter at sende til dem der matcher.
Det må blive løsningen. Således kan jeg scedulere via Win Sceduler eller i min egen kode for fetching hvert minut.

Endnu engang, tak for din ekspertice

/BBA
http://www.email2sms.dk
Avatar billede trer Nybegynder
29. januar 2004 - 21:32 #5
Okay - held og lykke med din applikation.
Avatar billede trer Nybegynder
31. januar 2004 - 14:42 #6
Hmm... svaret står stadig ikke accepteret - Har du husket at markere mit nick i den dersens lille blok før du trykkede "Accepter"?
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