Câu hỏi của bạn vẫn chưa rõ ràng. Chỉ giám sát một loại thay đổi - "dữ liệu mới" (INSERT) theo tiêu đề - phức tạp hơn việc phát hiện bất kỳ thay đổi nào (theo I want to detect the Changes in my table
trong nhận xét đơn giản hơn).
MySql
cung cấp phương tiện để lấy tổng tổng của một bảng:
checksum table TABLE_NAME [QUICK | EXTENDED]
Kết quả MySQL Workbench cho bảng InnoDB và MyISAM:
Bằng cách theo dõi các thay đổi trong các giá trị trả về đó, bạn có thể phát hiện bất kỳ thay đổi nào. Nhưng lưu ý:
- Bảng phải được tạo bằng
Checksum = 1
tùy chọn -
QUICK
tùy chọn này không hoạt động trên các bảng InnoDB trước phiên bản 5.7.2 (IIRC và phiên bản Community hiện tại là 5.7.14).
May mắn thay, nếu bạn không chỉ định một tùy chọn, MySQL dường như chọn tùy chọn nhanh nhất sẽ trả về một giá trị. Vì vậy, việc theo dõi các thay đổi theo bảng trên Bộ hẹn giờ trở nên dễ dàng:
' 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)
Khởi tạo:
Timer1.Enabled = True
Tables = New List(Of TableItem)
Tables.Add(New TableItem("Sample"))
Tables.Add(New TableItem("SampleISAM"))
Sự kiện 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
Phương pháp của tôi làm điều gì đó, chúng tôi chỉ báo cáo các thay đổi đối với hộp danh sách:
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
Để thực sự theo dõi thứ gì đó giống như CHỈ INSERTS, bạn cần sử dụng một số loại bảng nhật ký. Thêm trình kích hoạt cập nhật bảng đó bằng TimeStamp và có thể là mã hành động ("chèn", "xóa"). Sau đó, chỉ cần kiểm tra TimeStamp để tìm các thay đổi, có thể lọc ra các hành động không xem.
Riêng một phiên bản để xem nhiều bảng hoặc một số sự kiện thay đổi nhất định sẽ hoạt động tốt hơn như một lớp. Mã hẹn giờ có thể được đóng gói và nó có thể tạo ra các sự kiện thay đổi bảng.
- MySQL phiên bản 5.6 13.7.2.3 Cú pháp BẢNG CHECKSUM