Ellenőrizze a módosítások egy SQL Server tábla?

szavazat
122

Hogyan tudom nyomon követni egy SQL Server adatbázis módosításával egy asztal használata nélkül kiváltó vagy szerkezetének módosítására az adatbázis bármilyen módon? Saját előnyös programozási környezet .NET és C #.

Szeretném tudni, hogy támogassa minden SQL Server 2000 SP4 vagy újabb. Az alkalmazás egy bolt-on adatvizualizáció egy másik cég terméke. Ügyfélkörünk a több ezer, így nem akarom, hogy meg kell tenni a követelményeknek, hogy módosítsa a harmadik féltől asztala minden telepítést.

By „átváltozik egy tábla” Úgy értem változások táblázat adatai nem változik táblázat szerkezetét.

Végül, szeretnék a változást kiváltó esemény a jelentkezésemet, ahelyett, hogy van-e változás időközzel.


A legjobb, amit tehet adott a követelményeknek (nincs kiváltó vagy séma módosítása, az SQL Server 2000 és 2005) úgy tűnik, hogy kell használni a BINARY_CHECKSUMfunkciót T-SQL . Ahogy én megvalósítását tervezi a következő:

X másodpercenként fut a következő lekérdezést:

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

És hasonlítsa össze, hogy ellen a tárolt érték. Ha az érték megváltozott, menjen át a táblázat sorról sorra a lekérdezés:

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

És hasonlítsa össze a visszaküldött checksums ellen tárolt értékeket.

A kérdést 01/08/2008 13:35
a forrás felhasználó
Más nyelveken...                            


8 válasz

szavazat
25

Miért nem akarja használni kiváltó? Ők egy jó dolog, ha használja őket helyesen. Ha használjuk őket, mert így érvényesíteni referenciális integritás, hogy mikor megy a jó a rossz. De, ha használja őket az ellenőrzés, hogy nem igazán tekinthető tabu.

Válaszolt 01/08/2008 14:07
a forrás felhasználó

szavazat
18

Van egy DTS munka (vagy a feladat, hogy elindul egy Windows szolgáltatás) mely egy adott intervallumban. Minden alkalommal, amikor fut, ez lesz információt az adott tábla segítségével a rendszer INFORMATION_SCHEMA asztalok, és rögzíti az adatokat adattárban. Hasonlítsa össze az adatokat vissza a felépítését illetően az asztalon a visszaadott adatok az előző alkalommal. Ha ez eltér, akkor tudja, hogy a szerkezet megváltozott.

Példalekérdezés visszatérni tájékoztatást az összes oszlopot a táblázatban ABC (ideális esetben a hirdetést ki csak az oszlopokat a INFORMATION_SCHEMA asztalra, amit akar, ahelyett, hogy a * kiválasztásához **, mint én itt):

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

Azt ellenőrzi a különböző oszlopok és INFORMATION_SCHEMA nézetek attól függően, hogy pontosan határozná meg „egy tábla módosításai”.

Válaszolt 01/08/2008 15:06
a forrás felhasználó

szavazat
90

Vessen egy pillantást a CHECKSUM parancsot:

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

Hogy vissza fog térni az azonos számú, valahányszor valaki addig folytatódik, amíg a tábla tartalma nem változott. Lásd a bejegyzés ezen További információk:

CHECKSUM

Itt van, hogyan használják azt újjáépíteni cache függésből asztalok megváltozott:
ASP.NET 1.1 adatbázis cache függőség nélkül (triggerek)

Válaszolt 02/08/2008 06:20
a forrás felhasználó

szavazat
19

Milyen gyakran kell-e változás, és milyen nagy (az sorméretkorlátot) a táblákat az adatbázisban? Ha a CHECKSUM_AGG(BINARY_CHECKSUM(*))javasolt módszer John, hogy átvizsgálja minden sorban a megadott asztalra. A NOLOCKcélzás segít, de egy nagy adatbázis, akkor még mindig üti minden sorban. Azt is el kell tárolni az ellenőrző minden egyes sor úgy, hogy azt mondja az egyik megváltozott.

Van úgy megy át ez egy másik irányból? Ha nem kívánja módosítani a séma hozzá kiváltó, (ami bizonyos értelemben, ez nem az adatbázis), Van úgy dolgozik az alkalmazás szállítóját, hogy nem teszi az adatbázis?

Nem tudták végrehajtani egy API, amely mechanizmust biztosít a bejelentő kiegészítő alkalmazások, amelyek adatai megváltoztak. Ez lehet olyan egyszerű, mint írásban értesítést táblázat, amely felsorolja, hogy mit asztal és melyik sorban módosították. Hogy lehetne megvalósítani keresztül kiváltó vagy alkalmazás kódját. Az Ön oldalán, ti nem számít, az egyetlen gond lenne beolvasni a bejelentés asztal rendszeres időközönként. Az előadás találatot az adatbázis lenne sokkal kisebb, mint fürkésző minden sor változásokat.

A kemény része lenne meggyőző az alkalmazás szállítóját, hogy végre ezt a funkciót. Mivel ez lehet fogantyúval teljesen át SQL keresztül kiváltó, meg tudná csinálni a nagy részét a munka a számukra írásban és tesztelése a kiváltó, majd hozza a kódot az alkalmazás forgalmazójával. Azáltal, hogy a gyártó támogatja a kiváltó, hogy elkerüljük azt a helyzetet, ahol a hozzá kiváltó véletlenül helyettesíti a ravaszt a forgalmazó.

Válaszolt 03/08/2008 14:59
a forrás felhasználó

szavazat
13

Vad hiszem itt: Ha nem kívánja módosítani a harmadik fél asztal, lehet létrehozni egy nézetet, majd tesz egy ravaszt, hogy véleménye?

Válaszolt 05/08/2008 02:12
a forrás felhasználó

szavazat
17

Sajnos, nem hiszem, hogy van egy tiszta módja ennek SQL2000. Ha szűkíteni a követelményeket, hogy az SQL Server 2005 (és újabb), akkor az üzleti életben. Használhatja a SQLDependencyosztály System.Data.SqlClient. Lásd Query értesítések az SQL Server (ADO.NET) .

Válaszolt 06/08/2008 02:54
a forrás felhasználó

szavazat
30

Sajnos összege nem működik mindig helyesen változások kimutatására . Ez csak egy primitív ellenőrző és nincs CRC számítás. Ezért nem tud használni, hogy érzékeli minden változik, például szimmetrikus változások az azonos CHECKSUM!

Például. Az oldatot CHECKSUM_AGG(BINARY_CHECKSUM(*))szállít