Überprüfen Sie, ob Änderungen an einer SQL Server-Tabelle?

stimmen
122

Wie kann ich ohne Trigger oder Modifizierung der Struktur der Datenbank in irgendeiner Weise eine SQL - Server - Datenbank für Änderungen an einer Tabelle überwachen? Meine bevorzugte Programmierumgebung ist .NET und C #.

Ich möchte in der Lage sein , jede Unterstützung von SQL Server 2000 SP4 oder höher. Meine Anwendung ist eine Bolt-on Datenvisualisierung für ein anderes Produkt des Unternehmens. Unser Kundenstamm ist in den Tausenden, so will ich nicht Anforderungen stellen in müssen, dass wir die Drittanbieter Tisch bei jeder Installation ändern.

Durch „Änderungen an einer Tabelle“ Ich meine Änderungen an Tabellendaten, keine Änderungen an Tabellenstruktur.

Letztlich würde ich die Änderung wie ein Ereignis in meiner Anwendung auszulösen, statt in einem Intervall auf Änderungen zu überprüfen hat.


Die beste Vorgehensweise gegeben meine Anforderungen (keine Trigger oder Schemaänderung, SQL Server 2000 und 2005) scheint die zu sein , zu verwenden BINARY_CHECKSUMFunktion in T-SQL . Die Art , wie ich Plan umzusetzen , ist dies:

Alle X Sekunden die folgende Abfrage:

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

Und vergleichen Sie das mit dem gespeicherten Wert. Wenn der Wert geändert hat, geht durch die Tabelle Zeile für Zeile mit der Abfrage:

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

Und vergleichen Sie die zurückgegebenen Prüfsummen gegen gespeicherten Werte.

Veröffentlicht am 01/08/2008 um 13:35
quelle vom benutzer
In anderen Sprachen...                            


8 antworten

stimmen
90

Werfen Sie einen Blick auf die CHECKSUM-Befehl:

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

Das wird die gleiche Anzahl jedes Mal zurückkehren es so lange laufen gelassen, wie der Inhalt der Tabelle nicht geändert haben. Siehe meinen Beitrag zu diesem Thema für weitere Informationen:

CHECKSUM

Hier ist , wie ich verwenden es Cache Abhängigkeiten neu zu erstellen , wenn Tabellen geändert:
ASP.NET 1.1 Datenbank Cacheabhängigkeit (ohne Trigger)

Beantwortet am 02/08/2008 um 06:20
quelle vom benutzer

stimmen
30

Leider arbeiten CHECKSUM nicht immer richtig Änderungen zu erkennen . Es ist nur eine primitive Prüfsumme und keine CRC - Berechnung. Daher können Sie es nicht alle Änderungen zu erfassen , verwenden, zB symmetrische Veränderungen führen im gleichen CHECKSUM!

Z.B. die Lösung mit CHECKSUM_AGG(BINARY_CHECKSUM(*))liefert immer 0 für alle drei Tabellen mit unterschiedlichen Inhalten!


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!

Beantwortet am 30/03/2011 um 13:07
quelle vom benutzer

stimmen
25

Warum wollen Sie nicht Auslöser benutzen? Sie sind eine gute Sache, wenn man sich richtig zu verwenden. Wenn man sie als eine Möglichkeit, um referenzielle Integrität zu erzwingen, ist, wenn sie von gut bis schlecht gehen. Aber wenn man sie zur Überwachung nutzen, sind sie nicht wirklich als Tabu.

Beantwortet am 01/08/2008 um 14:07
quelle vom benutzer

stimmen
19

Wie oft müssen Sie auf Änderungen überprüfen und wie groß (in Bezug auf die Zeilengröße) sind die Tabellen in der Datenbank? Wenn Sie die Verwendung CHECKSUM_AGG(BINARY_CHECKSUM(*))Methode von John vorgeschlagen, es wird jede Zeile der angegebenen Tabelle scannen. Der NOLOCKHinweis hilft, aber auf einer großen Datenbank, schlagen Sie noch jede Zeile. Sie werden auch die Prüfsumme für jede Zeile speichern müssen , damit Sie sagen , man hat sich geändert.

Haben Sie darüber nachgedacht dies aus einem anderen Blickwinkel gehen? Wenn Sie möchten, dass das Schema nicht ändern Trigger hinzuzufügen, (die einen Sinn macht, dann ist es nicht Ihre Datenbank), haben Sie darüber nachgedacht mit dem Hersteller der Anwendung arbeiten, die die Datenbank machen?

Sie konnten eine API implementieren, die zum Mitteilen Zubehör Apps einen Mechanismus bereitstellt, die Daten geändert hat. Es könnte so einfach sein, wie an eine Benachrichtigungstabelle schreiben, die auflistet, welche Tabelle und welche Zeile geändert wurden. Das könnte durch Trigger oder Anwendungscode implementiert werden. Von Ihrer Seite, würde ti keine Rolle, Ihre einzige Sorge würde die Benachrichtigungstabelle in regelmäßigen Abständen wird gescannt. Die Leistung auf der Datenbank betroffen wäre weit weniger als jede Zeile für Änderungen zu scannen.

Der schwierige Teil wäre an den Hersteller zu überzeugen, um diese Funktion zu implementieren. Da diese Griffe über Auslöser vollständig durch SQL sein kann, könnte man für sie den Großteil der Arbeit durch das Schreiben und die Trigger zu testen und dann den Code auf den Hersteller der Anwendung zu bringen. Dadurch, dass die Auslöser die Hersteller-Support, verhindern, dass es die Situation, wo Ihr einen Trigger Hinzufügen ersetzt versehentlich einen Trigger vom Hersteller geliefert.

Beantwortet am 03/08/2008 um 14:59
quelle vom benutzer

stimmen
18

Haben Sie einen DTS - Auftrag (oder einen Job, der von einem Windows - Dienst gestartet wird) , die in einem bestimmten Intervall ausgeführt wird . Jedes Mal , es ausgeführt wird, wird es Informationen über die angegebene Tabelle durch das System mit INFORMATION_SCHEMA Tabellen und zeichnet diese Daten im Daten - Repository. Vergleichen Sie die Daten in Bezug auf die Struktur der Tabelle zurück mit den Daten , die frühere Zeit zurückgeführt . Wenn es anders ist, dann wissen Sie , dass die Struktur geändert hat.

Beispiel Abfrage zurückzukehren Informationen über alle Spalten in der Tabelle ABC (im Idealfall nur die Spalten aus der INFORMATION_SCHEMA Tabelle, dass Sie wollen, anstatt mit * wählen ** wie ich hier zu tun):

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

Sie würden verschiedene Spalten und INFORMATION_SCHEMA Ansichten überwachen je nachdem, wie genau Sie „Änderungen an einer Tabelle“ zu definieren.

Beantwortet am 01/08/2008 um 15:06
quelle vom benutzer

stimmen
17

Leider glaube ich nicht , dass es eine saubere Art und Weise ist dies in SQL2000 zu tun. Wenn Sie Ihre Anforderungen auf SQL Server 2005 (und höher) verengen, dann sind Sie im Geschäft. Sie können die Verwendung SQLDependencyin der Klasse System.Data.SqlClient. Siehe Abfragebenachrichtigungen in SQL Server (ADO.NET) .

Beantwortet am 06/08/2008 um 02:54
quelle vom benutzer

stimmen
13

Wilde Vermutung hier: Wenn Sie den Dritten Tabellen nicht ändern möchten, können Sie eine Ansicht erstellen und setzen dann einen Trigger für diese Ansicht?

Beantwortet am 05/08/2008 um 02:12
quelle vom benutzer

stimmen
7

Überprüfen Sie das letzte Datum begehen. Jede Datenbank hat eine Geschichte von, wenn jeder begehen wird. Ich glaube, es ist ein Standard der ACID-Compliance.

Beantwortet am 24/07/2014 um 05:58
quelle vom benutzer

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