Se etter endringer i en SQL Server bordet?

stemmer
125

Hvordan kan jeg overvåke en SQL Server-database for endringer i en tabell uten å bruke triggere eller endre strukturen i databasen på noen måte? Min foretrukne programmeringsmiljø er .NET og C #.

Jeg vil gjerne være i stand til å støtte noen SQL Server 2000 SP4 eller nyere. Min søknad er en bolt-on datavisualisering for et annet selskap produkt. Vår kundebase er i tusenvis, så jeg ønsker ikke å måtte sette inn krav om at vi endrer tredjepartsleverandør bord på hver installasjon.

Ved å endres til en tabell Jeg mener endringer i tabelldata, ikke endringer i tabellstruktur.

Til syvende og sist, jeg ønsker at endringen skal utløse en hendelse i søknaden min, i stedet for å måtte se etter endringer i et intervall.


Det beste løpet av handlingen gitt mine krav (ingen utløser eller skjemamodifikasjon, SQL Server 2000 og 2005) synes å være å bruke BINARY_CHECKSUMfunksjonen i T-SQL . Måten jeg har tenkt å gjennomføre dette:

Hvert X sekund kjøre følgende spørring:

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
FROM sample_table
WITH (NOLOCK);

Og sammenligne det mot den lagrede verdien. Hvis verdien er endret, gå gjennom tabellen rad for rad bruke søket:

SELECT row_id, BINARY_CHECKSUM(*)
FROM sample_table
WITH (NOLOCK);

Og sammenligne de returnerte summer mot lagrede verdier.

Publisert på 01/08/2008 klokken 12:35
kilden bruker
På andre språk...                            


8 svar

stemmer
93

Ta en titt på CHECKSUM kommando:

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM sample_table WITH (NOLOCK);

Det vil returnere samme nummer hver gang det kjøres så lenge innholdet i tabellen ikke har endret seg. Se mitt innlegg på denne for mer informasjon:

CHECKSUM

Her er hvordan jeg brukte den til å gjenoppbygge cache avhengigheter når tabeller endret:
ASP.NET 1.1 database cache avhengighet (uten utløser)

Svarte 02/08/2008 kl. 05:20
kilden bruker

stemmer
30

Dessverre CHECKSUM fungerer ikke alltid riktig for å oppdage endringer . Det er bare en primitiv sjekksum og ingen CRC beregning. Derfor kan du ikke bruke den til å oppdage alle endringer, f.eks symmetriske endringer resultere i samme CHECKSUM!

E. g. løsningen med CHECKSUM_AGG(BINARY_CHECKSUM(*))leverer alltid 0 for alle 3 bord med forskjellig innhold!


SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM 
(
  SELECT 1 as numA, 1 as numB
  UNION ALL
  SELECT 1 as numA, 1 as numB
)  q
-- delivers 0!

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM ( SELECT 1 as numA, 2 as numB UNION ALL SELECT 1 as numA, 2 as numB ) q -- delivers 0!

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM ( SELECT 0 as numA, 0 as numB UNION ALL SELECT 0 as numA, 0 as numB ) q -- delivers 0!

Svarte 30/03/2011 kl. 12:07
kilden bruker

stemmer
26

Hvorfor ønsker du ikke å bruke triggere? De er en god ting hvis du bruker dem riktig. Hvis du bruker dem som en måte å håndheve referanseintegritet det er når de går fra god til dårlig. Men hvis du bruker dem for å overvåke, de er egentlig ikke ansett som tabu.

Svarte 01/08/2008 kl. 13:07
kilden bruker

stemmer
20

Hvor ofte trenger du å se etter endringer og hvor stor (i form av raden størrelse) er tabeller i databasen? Hvis du bruker CHECKSUM_AGG(BINARY_CHECKSUM(*))metoden foreslått av John, vil den skanne hver rad i den angitte tabellen. Den NOLOCKhint hjelper, men på en stor database, er du fortsatt treffer hver rad. Du må også lagre sjekksummen for hver rad slik at du forteller en har endret seg.

Har du vurdert å gå på dette fra en annen vinkel? Hvis du ikke ønsker å endre skjemaet for å legge til triggere, (som gir en følelse, det er ikke din database), har du vurdert å jobbe med programvareleverandøren som gjør gjøre databasen?

De kunne gjennomføre en API som gir en mekanisme for å varsle aksessoriske programmer som data er endret. Det kan være så enkelt som å skrive en melding tabell som viser hva tabellen og hvilken rad ble endret. Det kan bli implementert gjennom utløser eller programkode. Fra din side, ville ti ingen rolle, din eneste bekymring vil være skanning meldingen bordet med jevne mellomrom. Forestillingen treffer på databasen ville være langt mindre enn skanning hver rad for endringer.

Den harde delen vil være å overbevise programvareleverandøren for å implementere denne funksjonen. Siden dette kan være håndtakene helt gjennom SQL via triggere, kan du gjøre det meste av arbeidet for dem ved å skrive og teste triggere og deretter bringe koden til programvareleverandøren. Ved å ha den leverandøren støtte triggere, det hindre situasjonen hvor du legger en utløser utilsiktet erstatter en trigger levert av leverandøren.

Svarte 03/08/2008 kl. 13:59
kilden bruker

stemmer
18

Dessverre tror jeg ikke at det er en ren måte å gjøre dette i SQL2000. Hvis du begrense dine krav til SQL Server 2005 (og senere), så du er i business. Du kan bruke SQLDependencyklassen i System.Data.SqlClient. Se Kriterier opplysninger i SQL Server (ADO.NET) .

Svarte 06/08/2008 kl. 01:54
kilden bruker

stemmer
18

Ha en DTS jobb (eller en jobb som er startet av en Windows-tjeneste) som kjører på et gitt intervall. Hver gang det kjøres, blir det informasjon om den gitte tabellen ved å bruke systemet INFORMATION_SCHEMA bord, og registrerer disse dataene i datalageret. Sammenligne dataene tilbake om strukturen av tabellen med dataene tilbake forrige gang. Hvis det er forskjellig, så vet du at strukturen er endret.

Eksempel spørring for å returnere informasjon om alle kolonnene i tabellen ABC (ideelt liste ut bare de kolonnene fra INFORMATION_SCHEMA tabellen som du vil, i stedet for å bruke * Velg ** som jeg gjør her):

select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'ABC'

Du ville overvåke ulike kolonner og visninger INFORMATION_SCHEMA avhengig av hvor nøyaktig du definerer "endres til et bord".

Svarte 01/08/2008 kl. 14:06
kilden bruker

stemmer
13

Wild gjetning her: Hvis du ikke ønsker å endre tredjemanns bord, kan du opprette en visning, og deretter sette en trigger på denne visningen?

Svarte 05/08/2008 kl. 01:12
kilden bruker

stemmer
7

Sjekk siste begå dato. Hver database har en historie med når hver begår er gjort. Jeg tror det er en standard for ACID etterlevelse.

Svarte 24/07/2014 kl. 04:58
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more