Mysql
 sql >> Database >  >> RDS >> Mysql

Monitora i nuovi dati nella tabella MySQL

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.