La tua domanda rimane poco chiara. Monitorare un solo tipo di modifica - "nuovi dati" (INSERT) come da titolo - è più complicato che rilevare qualsiasi modifica (come per I want to detect the Changes in my table
nei commenti che è più semplice).
MySql
fornisce i mezzi per ottenere il checksum di una tabella:
checksum table TABLE_NAME [QUICK | EXTENDED]
Risultati MySQL Workbench per una tabella InnoDB e MyISAM:
Osservando le modifiche in quei valori restituiti, puoi rilevare qualsiasi modifica. Ma nota:
- La tabella deve essere stata creata con il
Checksum = 1
opzione - Il
QUICK
l'opzione non funziona su tabelle InnoDB precedenti alla versione 5.7.2 (IIRC e l'attuale versione Community è 5.7.14).
Fortunatamente, se non si specifica un'opzione, MySQL sembra scegliere quella più veloce che restituirà un valore. Quindi, diventa facile tenere traccia delle modifiche per tabella su un timer:
' 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)
Inizializza:
Timer1.Enabled = True
Tables = New List(Of TableItem)
Tables.Add(New TableItem("Sample"))
Tables.Add(New TableItem("SampleISAM"))
L'evento Tick timer:
' 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
Il mio metodo "fai qualcosa" ci riporta semplicemente le modifiche a una casella di riepilogo:
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
Per guardare effettivamente qualcosa come solo INSERTS, dovresti usare una sorta di tabella di registro. Aggiungi un trigger che aggiorni quella tabella con un TimeStamp e forse un codice di azione ("inserisci", "elimina"). Quindi controlla semplicemente il TimeStamp per le modifiche, magari filtrando le azioni non di visualizzazione.
In particolare una versione per guardare più tabelle o determinati eventi di modifica funzionerà meglio come classe. Il codice del timer può essere incapsulato e potrebbe generare eventi per le modifiche di una tabella.
- MySQL v. 5.6 13.7.2.3 Sintassi della TABELLA CHECKSUM