Mysql
 sql >> Base de données >  >> RDS >> Mysql

Surveiller les nouvelles données dans la table MySQL

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.