Zkontrolujte, zda změny v tabulce serveru SQL Server?

hlasů
122

Jak mohu sledovat databázi SQL Server pro změny do tabulky bez použití spouštěčů nebo modifikovat strukturu databáze v žádném případě? Můj přednost programovací prostředí .NET a C #.

Chtěl bych být schopen podporovat jakýkoli SQL Server 2000 SP4 nebo novější. Moje aplikace je přišroubované vizualizace dat pro výrobek jiné společnosti. Naše zákaznická základna je v tisících, takže nechci muset dát do požadavků, které jsme modifikují tabulku třetí strany dodavatele při každé instalaci.

By „se změní na stole“ mám na mysli změny v tabulkových dat, nikoli změn struktury tabulky.

Nakonec bych rád změnu vyvolat událost v mé žádosti, aniž by museli zkontrolovat změny v intervalu.


Nejlepší postup vzhledem k mé požadavky (žádná pravidla nebo změna schématu, SQL Server 2000 a 2005) se zdá být použití BINARY_CHECKSUMfunkce v T-SQL . Jak jsem v plánu provést, je toto:

Každých X sekund spustit následující dotaz:

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

A porovnat, že proti uložené hodnoty. Pokud došlo ke změně hodnoty, projít řádku tabulky po řádku pomocí dotazu:

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

A porovnat vrácených kontrolních součtů proti uloženými hodnotami.

Položena 01/08/2008 v 13:35
zdroj uživatelem
V jiných jazycích...                            


8 odpovědí

hlasů
90

Podívejte se na příkazu Kontrolní součet:

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

Že se vrátí stejný počet pokaždé, když je spuštěn tak dlouho, dokud obsah tabulky se nezměnily. Viz můj příspěvek na toto téma pro více informací:

CHECKSUM

Zde je návod, jak jsem ji znovu mezipaměti závislostí při změněné tabulky:
Cache 1.1 databáze ASP.NET závislost (bez spouštěče)

Odpovězeno 02/08/2008 v 06:20
zdroj uživatelem

hlasů
30

Bohužel CHECKSUM nefunguje vždy řádně detekovat změny . Je to jen primitivní kontrolní a žádný výpočet CRC. Z tohoto důvodu nelze použít k detekci všech změn, například symetrické změny vedou ke stejné kontrolní součet!

E. g. roztok se CHECKSUM_AGG(BINARY_CHECKSUM(*))dodává vždy 0 pro všechny 3 tabulek s různým obsahem!


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!

Odpovězeno 30/03/2011 v 13:07
zdroj uživatelem

hlasů
25

Proč nechcete používat triggery? Jsou to dobrá věc, pokud je správně používat. Pokud je budete používat jako způsob, jak vynutit referenční integrity, která je, když jdou z dobré špatné. Ale pokud budete používat pro sledování, ale ve skutečnosti nejsou považovány za tabu.

Odpovězeno 01/08/2008 v 14:07
zdroj uživatelem

hlasů
19

Jak často je třeba zkontrolovat změny a jak velký (pokud jde o velikost řádku) jsou tabulky v databázi? Pokud použijete CHECKSUM_AGG(BINARY_CHECKSUM(*))metodu navrženou Johnem, to bude testovat každý řádek zadané tabulky. NOLOCKNáznak pomáhá, ale na velké databáze, jste stále bít každý řádek. Budete také muset uchovávat kontrolní součet pro každý řádek tak, že ti říct, kdo se změnil.

Uvažovali jste se na to z jiného úhlu? Pokud si nechcete změnit schéma pro přidání spouštěčů, (který dělá dojem, že to není vaše databáze), Uvažovali jste o práci s dodavatelem aplikace, která dělá, aby databáze?

Mohli implementovat rozhraní API, které poskytuje mechanismus pro oznamování příslušenství aplikace, které údaje se změnila. Mohlo by to být tak jednoduché, jak psát na oznámení tabulky se seznamem, co tabulka a který řádek byl upraven. Které by mohly být prováděny prostřednictvím spouštěče nebo kódu aplikace. Z vaší strany, ti by nevadilo, vaše jediná starost by procházením tabulky pro oznamování v pravidelných intervalech. Představení hit na databázi by bylo mnohem méně, než kontroluje každý řádek pro změny.

Nejtěžší bude přesvědčit dodavatele aplikace a implementovat tuto funkci. Protože to může být kliky zcela prostřednictvím SQL přes triggery, jsi to mohl udělat převážnou část práce pro ně tím, že píše a testování spoušť a pak přinášet kód dodavatele aplikace. Tím, že podpory ze strany firmy spouštěče, že nedošlo k situaci, kdy váš přidání spoušť neúmyslně nahrazuje spoušť dodávanou výrobcem.

Odpovězeno 03/08/2008 v 14:59
zdroj uživatelem

hlasů
18

Mít práci, DTS (nebo práci, která je zahájena služba Windows), která se spouští v daném intervalu. Pokaždé, když je spuštěn, se dostane informace o dané tabulce pomocí systému INFORMATION_SCHEMA tabulky a zaznamenává tato data v datovém úložišti. Porovnávat data vrácena, pokud jde o strukturu tabulky s údaji vrátila předcházející čas. Pokud se liší, pak víte, že struktura změnila.

Příklad dotazu vrátit informace týkající se všechny sloupce v tabulce ABC (ideálně výpis z pouhých sloupce z tabulky INFORMATION_SCHEMA, které chcete, namísto použití * vybrat ** jako já zde):

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

Ty by monitorovat různých sloupců a názory INFORMATION_SCHEMA v závislosti na tom, jak přesně definovat „změní na stole“.

Odpovězeno 01/08/2008 v 15:06
zdroj uživatelem

hlasů
17

Bohužel si nemyslím, že je čistý způsob, jak to udělat v SQL2000. Máte-li zúžit požadavky na SQL Server 2005 (a novější), pak jste v podnikání. Můžete použít SQLDependencytřídu System.Data.SqlClient. Viz dotazu oznámení v SQL Server (ADO.NET) .

Odpovězeno 06/08/2008 v 02:54
zdroj uživatelem

hlasů
13

Wild odhad zde: Pokud nechcete měnit tabulky třetí stranou, můžete vytvořit zobrazení a pak dal spoušť na tomto názoru?

Odpovězeno 05/08/2008 v 02:12
zdroj uživatelem

hlasů
7

Podívejte se na poslední datum spáchání. Každý databáze má za sebou historii, kdy každý commit je vyroben. Věřím, že jeho norma dodržování ACID.

Odpovězeno 24/07/2014 v 05:58
zdroj uživatelem

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