sql >> Database >  >> RDS >> Mysql

Nieuwe gegevens in MySQL-tabel bewaken

Uw vraag blijft onduidelijk. Het bewaken van slechts één type wijziging - "nieuwe gegevens" (INSERT) volgens de titel - is ingewikkelder dan het detecteren van elke wijziging (volgens I want to detect the Changes in my table in opmerkingen, wat eenvoudiger is).

MySql biedt de mogelijkheid om de controlesom van een tabel te krijgen:

checksum table TABLE_NAME [QUICK | EXTENDED]

MySQL Workbench-resultaten voor een InnoDB- en MyISAM-tabel:

Door te letten op wijzigingen in die retourwaarden, kunt u elke wijziging detecteren. Maar let op:

  • De tabel moet zijn gemaakt met de Checksum = 1 optie
  • De QUICK optie werkt niet op InnoDB-tabellen ouder dan versie 5.7.2 (IIRC en de huidige Community-versie is 5.7.14).

Gelukkig, als je geen optie opgeeft, lijkt MySQL de snelste te kiezen die een waarde zal retourneren. Het wordt dus gemakkelijk om wijzigingen per tabel op een Timer bij te houden:

' 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)

Initialiseren:

Timer1.Enabled = True

Tables = New List(Of TableItem)
Tables.Add(New TableItem("Sample"))
Tables.Add(New TableItem("SampleISAM"))

Het Timer Tick-evenement:

' 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

Mijn doe-iets-methode, we rapporteren de wijzigingen gewoon in een keuzelijst:

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

Om echt naar iets als alleen INSERTS te kijken, zou je een soort logtabel moeten gebruiken. Voeg een trigger toe die die tabel bijwerkt met een TimeStamp en misschien actiecode ("insert", "delete"). Controleer dan de TimeStamp op wijzigingen, misschien filtert u niet-kijken acties uit.

Vooral een versie om meerdere tafels te bekijken of bepaalde veranderingsgebeurtenissen zal als klas beter werken. De timercode kan worden ingekapseld en kan gebeurtenissen veroorzaken voor tafelwijzigingen.




  1. De naam van een beperking vinden in MySQL

  2. Recursieve query in SQL Server

  3. PHP:afbeelding ophalen uit MySQL met PDO

  4. Eenvoudig Ajax JQuery-script - Hoe kan ik informatie krijgen voor elk van de rijen in de tabel?