Avatar billede byhring Nybegynder
05. april 2004 - 13:39 Der er 7 kommentarer

pull teknologi

Hej

Hvordan kan jeg sætte en agent til at lytte på en tabel, så jeg kontinuerligt udtrækker nyeste data ?

:-) Jørgen
Avatar billede trer Nybegynder
05. april 2004 - 14:14 #1
Du skal først og fremmest kunne identificere hvad du mener er de nyeste data - dernæst skal du blot lave et job i Sql Server Agenten der selecter disse og lægger dem et sted du har glæde af dem.
Avatar billede byhring Nybegynder
05. april 2004 - 14:28 #2
Kunne du sende et link til hvad Sql Server Agenten er og hvordan denne håndteres ?
Avatar billede trer Nybegynder
05. april 2004 - 18:19 #3
Du kan finde information om jobs i Books Online installeret sammen med dine klientværktøjer til sql server (enterprise manager og query analyzer mv).

Hvis du kun har msde'en så kan du downloade books online fra microsofts hjemmeside - http://www.microsoft.com/sql
Avatar billede byhring Nybegynder
06. april 2004 - 08:56 #4
Okay jeg er ikke helt sikker på om det er hvad jeg søger. Jeg skal skrive en komponent (dll, exe, Web-service) der kan lytte på en tabels input. Hvis der sker ændringer skal jeg udføre en del andet kode og skrive i en anden tabel. Jeg skriver normalt kode i c#, jeg er dog ret usikker på hvad jeg kan bruge en SQL agent/job til her lige nu er jeg i tvivl hvilken retning jeg skal søge i ?
Avatar billede trer Nybegynder
06. april 2004 - 10:17 #5
Ok, kort synopsis:

SQL Server Agenten kan schedulerer jobs internt i SQL Serveren. Disse jobs består af en række separate trin typisk skrevet som et T-SQL Script (eksterne scripts, activex objekter etc kan også bruges) og hvert trin afslutter med en status og en information om hvilket trin der skal udføres som det næste (afhængigt af success/failure).

Job Scheduleren er ganske fint lavet - væsenligt bedre end den normale Windows Scheduler. I SQL Server Agentens scheduler er en kørsel hver anden søndag og 8 kørsler hver tredje tirsdag mellem 10 og 15 ikke noget problem at sætte op!

Du kan i øvrigt styre os prioritet på jobs og meget andet godt.  Og jobs'ne er som jeg husker det objekter så du kan faktisk også kalde dem fra C/C++ og vel også C# :-)  Check efter SQL-DMO objekter i Books Online.

Men du skriver at du skal lytte på en tabels input.  Hvor hurtigt efter data er ændret vil du kunne reagere på det?

Hvis det skal være øjeblikkeligt, så skal du kigge på en trigger.  Den vil fyre i hver transaktion der opdaterer i tabellen så der vil der ikke være forsinkelse. 

Du kan så lade din trigger fyre en EXEC MASTER.DBO.XP_CMDSHELL 'filnavn' for at udføre et eksternt program - ellers skal du skrive al din kode i T-SQL. 

Minuset ved en trigger er, at den T-SQL kode du ligger ind forsinker transaktionen. Den kan først slutte når din kode er kørt. Fejler din kode ruller transaktionen tilbage.  Når du bruger xp_cmdshell er det dog "asynkront" og så gælder ovenstående ikke.

Ellers er din mulighed at du fx hvert minut checker om der er kommet noget nyt i tabellen. Er der det så må du køre din eksterne kode.  Det er asynkront - og kan være fordelagtigt hvis du ikke kan skrive dine handlinger i SQL / Eksterne scripts.

Appropos at finde ændringer i tabellen:

Den nemmeste måde at finde ændringer i tabellen på er ved at tilføje en kolonne af typen ROWVERSION. En ROWVERSION er styret 100% af SQL Server - og du kan som bruger ikke påvirke værdien i den. Det betyder at hvis du benytter wildcards i din SQL, så vil din kode fejle - du skal altid benytte kolonnenavne - og undlade at røre ved ROWVERSION kolonnen. 

Det den indeholder er et tidstempel for sidste ændring af en række. SQL Server opdaterer kolonnen ved hver eneste insert, delete og update - så hvis du blot "husker" en rowversion værdi, så kan du udfra den finde alle rækker der er blevet opdateret (inserted, updated) siden den huskede værdi.  Nemt og effektivt.

Du kan finde mere om ROWVERSION kolonnen i Books Online.

I øvrigt - hvis du forsøger at lave et auditeringssystem / revisionsspor på tabelniveau til SQL Server, så har "vi" - min arbejdsplads - da et færdigt system vi sælger :-)
Avatar billede byhring Nybegynder
06. april 2004 - 10:25 #6
Meget fornemt svar, nej jeg er ikke i revisionsbranchen (har været) er i ventilations branchen. Jeg vil kaste mig ud i en prototype på det beskrevne, jeg skal høre en gang til, noget eksempel kode ville være helt perfekt ;-) findes det ?
Avatar billede trer Nybegynder
06. april 2004 - 10:34 #7
Der er eksempler i Books Online på det meste. Men fx en trigger løsning er ret enkel at lave

create trigger [myTrigger] on [myTable]
for insert, update
as
begin

  exec master.dbo.xp_cmdshell 'path\extern.fil'

end
go

Nu vil den eksterne fil blive kaldt hvor hver transaktion der opdaterer (INSERT / UPDATE ) i MyTable.  Bemærk lige at uanset hvor mange rækker en transaktion opdaterer - så fyrer triggeren kun en gang.

At finde alle rækker der er ændret siden sidst er også simpelt:

select * from mytabel
where rv > @rv

hvor @rv er den rowversion værdi du har gemt.

at finde den højeste rowversion til at huske til næste kørsel er så

select max(rv) from mytabel

Sørg i øvrigt for at have et indeks på rv (rowversion) kolonnen - ellers hamrer performance i gulvet.

Hvis du har problemer med at tilføje en rv kolonne pga anden sql du ikke er herre over, så er følgende en "officiel" workaround for den slags problemer:

Du omdøber den originale tabel fra mytabel til t_mytabal

du opretter et view med det originale tabel-navn mytabel. viewet skal så tage samtlige kolonner undtagen rv med. Dermed skjuler du ændringerne i den underliggende tabel for al anden sql.
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