Votre question reste floue. La surveillance d'un seul type de changement - "nouvelles données" (INSERT) selon le titre - est plus compliquée que la détection de tout changement (selon I want to detect the Changes in my table
dans les commentaires ce qui est plus simple).
MySql
fournit le moyen d'obtenir la somme de contrôle d'une table :
checksum table TABLE_NAME [QUICK | EXTENDED]
Résultats MySQL Workbench pour une table InnoDB et MyISAM :
En surveillant les changements dans ces valeurs de retour, vous pouvez détecter tout changement. Mais attention :
- La table doit avoir été créée avec le
Checksum = 1
options - Le
QUICK
l'option ne fonctionne pas sur les tables InnoDB antérieures à la version 5.7.2 (IIRC et la version communautaire actuelle est 5.7.14).
Heureusement, si vous ne spécifiez pas d'option, MySQL semble choisir la plus rapide qui renverra une valeur. Ainsi, il devient facile de suivre les changements par table sur 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)
Initialiser :
Timer1.Enabled = True
Tables = New List(Of TableItem)
Tables.Add(New TableItem("Sample"))
Tables.Add(New TableItem("SampleISAM"))
L'événement 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
Ma méthode de faire quelque chose nous signale simplement les modifications apportées à une liste :
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
Pour surveiller réellement quelque chose comme uniquement des INSERTS, vous devez utiliser une sorte de table de journal. Ajoutez un déclencheur qui met à jour cette table avec un TimeStamp et peut-être un code d'action ("insert", "delete"). Ensuite, vérifiez simplement l'horodatage pour les modifications, en filtrant peut-être les actions non surveillées.
En particulier, une version pour regarder plusieurs tables ou certains événements de changement fonctionnera mieux en classe. Le code de la minuterie peut être encapsulé et il pourrait déclencher des événements pour un changement de table.
- MySQL v. 5.6 13.7.2.3 Syntaxe de la table de somme de contrôle