Ihre Frage bleibt unklar. Die Überwachung nur einer Art von Änderung – „neue Daten“ (INSERT) wie im Titel angegeben – ist komplizierter als die Erkennung jeder Änderung (gemäß I want to detect the Changes in my table
in Kommentaren, was einfacher ist).
MySql
bietet die Möglichkeit, die Prüfsumme einer Tabelle zu erhalten:
checksum table TABLE_NAME [QUICK | EXTENDED]
MySQL Workbench-Ergebnisse für eine InnoDB- und MyISAM-Tabelle:
Indem Sie auf Änderungen in diesen Rückgabewerten achten, können Sie jede Änderung erkennen. Aber beachten Sie:
- Die Tabelle muss mit dem
Checksum = 1
erstellt worden sein Möglichkeit - Der
QUICK
Option funktioniert nicht mit InnoDB-Tabellen vor Version 5.7.2 (IIRC und die aktuelle Community-Version ist 5.7.14).
Glücklicherweise scheint MySQL, wenn Sie keine Option angeben, die schnellste auszuwählen, die einen Wert zurückgibt. So wird es einfach, Änderungen pro Tabelle auf einem Timer zu verfolgen:
' Track last checksum by table
Friend Class TableItem
Public Property Name As String
Public Property CheckSum As Int64
Public Sub New(n As String)
Name = n
CheckSum = 0
End Sub
End Class
' a list of them to track more than one table:
Private Tables As List(Of TableItem)
Initialisieren:
Timer1.Enabled = True
Tables = New List(Of TableItem)
Tables.Add(New TableItem("Sample"))
Tables.Add(New TableItem("SampleISAM"))
Das Timer-Tick-Ereignis:
' Note: cannot use Parameters for table or col names
Dim sql = "CHECKSUM TABLE {0} "
Using dbcon As New MySqlConnection(mySQLConnStr)
dbcon.Open()
Using cmd As New MySqlCommand(sql, dbcon)
' loop thru collection, polling one at a time
For Each tbl As TableItem In Tables
cmd.CommandText = String.Format(sql, tbl.Name)
Using rdr As MySqlDataReader = cmd.ExecuteReader()
If rdr.Read Then
Dim thisResult = rdr.GetInt64(1)
' ignore the first result
If tbl.CheckSum = 0 Then
tbl.CheckSum = thisResult
Return
End If
' save the last non-zed value
If tbl.CheckSum <> thisResult Then
tbl.CheckSum = thisResult
' method to do something when changed:
TableChanged(tbl.Name)
End If
End If
End Using
Next
End Using
End Using
Meine Do-Something-Methode lässt uns einfach die Änderungen an ein Listenfeld melden:
Private Sub TableChanged(tbl As String)
lb.Items.Add(String.Format("Table {0} changed {1}", tbl,
DateTime.Now.ToString("HH:mm:ss.ffffff")))
End Sub
Um tatsächlich nur auf INSERTS zu achten, müssten Sie eine Art Protokolltabelle verwenden. Fügen Sie einen Trigger hinzu, der diese Tabelle mit einem TimeStamp und möglicherweise einem Aktionscode ("insert", "delete") aktualisiert. Überprüfen Sie dann einfach den TimeStamp auf Änderungen und filtern Sie möglicherweise Aktionen heraus, die nicht beobachtet werden.
Besonders eine Version, um mehrere Tische oder bestimmte Änderungsereignisse zu beobachten, wird als Klasse besser funktionieren. Der Timer-Code kann eingekapselt werden und könnte Ereignisse für Tabellenänderungen auslösen.
- MySQL v. 5.6 13.7.2.3 CHECKSUM TABLE-Syntax