Tu pregunta sigue sin estar clara. Monitorear solo un tipo de cambio - "datos nuevos" (INSERTAR) como se indica en el título - es más complicado que detectar cualquier cambio (según I want to detect the Changes in my table
en los comentarios, que es más simple).
MySql
proporciona los medios para obtener la suma de comprobación de una tabla:
checksum table TABLE_NAME [QUICK | EXTENDED]
Resultados de MySQL Workbench para una tabla InnoDB y MyISAM:
Al observar los cambios en esos valores devueltos, puede detectar cualquier cambio. Pero tenga en cuenta:
- La tabla debe haber sido creada con
Checksum = 1
opción - El
QUICK
La opción no funciona en tablas InnoDB anteriores a la versión 5.7.2 (IIRC y la versión actual de la comunidad es 5.7.14).
Afortunadamente, si no especifica una opción, MySQL parece elegir la más rápida que devolverá un valor. Por lo tanto, se vuelve fácil realizar un seguimiento de los cambios por tabla en un temporizador:
' 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)
Inicializar:
Timer1.Enabled = True
Tables = New List(Of TableItem)
Tables.Add(New TableItem("Sample"))
Tables.Add(New TableItem("SampleISAM"))
El evento Timer Tick:
' 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
Mi método para hacer algo nos informa los cambios en un cuadro de lista:
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
Para observar realmente algo como solo INSERTOS, necesitaría usar algún tipo de tabla de registro. Agregue un disparador que actualice esa tabla con un TimeStamp y tal vez un código de acción ("insertar", "eliminar"). Luego, solo verifique los cambios en la marca de tiempo, tal vez filtrando las acciones que no son de visualización.
En particular, una versión para ver varias mesas o ciertos eventos de cambio funcionará mejor como clase. El código del temporizador se puede encapsular y podría generar eventos para los cambios de una tabla.
- MySQL v. 5.6 13.7.2.3 Sintaxis de CHECKSUM TABLE