sql >> Base de Datos >  >> RDS >> Mysql

Supervisar nuevos datos en la tabla MySQL

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.