Chúng tôi có một cái gì đó tương tự trên một trong các trang web của chúng tôi, chúng tôi đã thêm một loạt các bảng:
users
sites
... vv
Sau đó, chúng tôi có một loạt các bảng bóng:
users-shadow
sites-shadow
... vv
Các bảng bóng có cấu trúc giống hệt các bảng thực ngoại trừ một dòng được thêm vào cho người dùng đã thực hiện thay đổi. Vì vậy, trước tiên, chúng tôi sử dụng truy vấn này khi một thay đổi được gửi bởi người dùng cần được chấp thuận các hành động đối với cơ sở dữ liệu của họ:
REPLACE INTO users-shadow (user_mod,id,username,password,salt...) VALUES (16,50,'bob','stuff','salt'...);
Rõ ràng, hãy đảm bảo điều này không mở để tiêm, hãy sử dụng báo cáo đã chuẩn bị sẵn vv
Khi được chấp thuận, một hàng trong shadow
bảng chỉ bị xóa khỏi shadow
bảng, user_mod
giá trị bị giảm và các thay đổi (giá trị không phải null) được chèn vào bảng thực (hoặc được cập nhật nếu một id
được chỉ định, sử dụng THAY THẾ
cú pháp). Chúng tôi thực hiện logic này trong perl nên thật đáng buồn là không có bất kỳ SQL nào trong tay.
Hãy nhớ rằng SQL REPLACE
thực hiện một DELETE
và một INSERT
chứ không phải là UPDATE
. Bạn sẽ cần phải sửa đổi bất kỳ trình kích hoạt nào để cho phép hành vi này.
Lưu ý:Lý do chúng tôi không sử dụng cờ 'phê duyệt' là chúng tôi cần khả năng sửa đổi các bản ghi hiện có, tất nhiên chúng tôi không thể có nhiều bản ghi có cùng một khóa chính.