sql >> Databáze >  >> RDS >> Mysql

Monitorujte nová data v tabulce MySQL

Vaše otázka zůstává nejasná. Sledování pouze jednoho typu změny – „nová data“ (INSERT) podle nadpisu – je složitější než zjišťování jakékoli změny (podle I want to detect the Changes in my table v komentářích, což je jednodušší).

MySql poskytuje prostředky k získání kontrolního součtu tabulky:

checksum table TABLE_NAME [QUICK | EXTENDED]

Výsledky MySQL Workbench pro tabulku InnoDB a MyISAM:

Sledováním změn v těchto návratových hodnotách můžete zjistit jakoukoli změnu. Ale pozor:

  • Tabulka musí být vytvořena s Checksum = 1 možnost
  • QUICK volba nefunguje na tabulkách InnoDB před verzí 5.7.2 (IIRC a aktuální verze komunity je 5.7.14).

Naštěstí, pokud neurčíte možnost, zdá se, že MySQL vybere tu nejrychlejší, která vrátí hodnotu. Takže je snadné sledovat změny podle tabulky na časovači:

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

Inicializovat:

Timer1.Enabled = True

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

Událost 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

Metoda My do something nám prostě nahlásí změny do seznamu:

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

Chcete-li skutečně sledovat něco jako pouze INSERTS, musíte použít nějakou tabulku protokolu. Přidejte spouštěč, který aktualizuje tuto tabulku časovým razítkem a možná kódem akce ("vložit", "smazat"). Pak stačí zkontrolovat změny TimeStamp, možná odfiltrovat akce, které nejsou sledovány.

Zejména verze pro sledování více tabulek nebo určitých změnových událostí bude jako třída fungovat lépe. Kód časovače může být zapouzdřen a může vyvolat události pro změny tabulky.




  1. Mínus vs kromě rozdílu v ORACLE/SQL Server

  2. Rychle vytvořte rozhraní PHP CRUD pomocí nástroje PDO Advanced CRUD Generator Tool

  3. Použití if(isset($_POST['submit'])) k nezobrazení ozvěny při otevřeném skriptu nefunguje

  4. Nezachycená výjimka 'PDOException' zpráva 'neplatný název zdroje dat'