Bos saya memiliki permintaan dari seorang pelanggan kemarin yang menanyakan bagaimana mereka bisa mengetahui siapa yang menghapus beberapa data dalam database SQL Server mereka (ini adalah edisi kilat jika itu penting).
Saya pikir ini dapat ditemukan dari log transaksi (asalkan belum terpotong) - apakah ini benar? Dan jika demikian, bagaimana Anda benar-benar mencari informasi ini?
sql-server
transaction
delete
audit
Matt Wilko
sumber
sumber
fn_dblog
. Satu kelemahannya adalah ia mengembalikan databaseUSERNAME()
daripada nama login yang jauh lebih berguna.Jika database dalam mode pemulihan penuh atau jika Anda memiliki cadangan log transaksi, Anda dapat mencoba membacanya menggunakan pembaca log pihak ketiga.
Anda dapat mencoba ApexSQL Log (premium tetapi memiliki uji coba gratis) atau SQL Log Rescue (gratis tetapi hanya sql 2000).
sumber
Meskipun ini dijawab, ingin menambahkan bahwa SQL Server memiliki jejak default diaktifkan dan dapat digunakan untuk mencari tahu siapa yang menjatuhkan / mengubah objek.
Acara objek
Acara objek meliputi: Objek Diubah, Objek Dibuat dan Objek Dihapus
catatan: SQL Server secara default memiliki 5 jejak file, masing-masing 20 MB dan tidak ada metode yang didukung untuk mengubahnya. Jika Anda memiliki sistem yang sibuk, file jejak mungkin bergulir terlalu cepat (bahkan dalam beberapa jam) dan Anda mungkin tidak dapat menangkap beberapa perubahan.
Contoh yang sangat baik dapat ditemukan: Jejak default di SQL Server - kekuatan audit kinerja dan keamanan
sumber
Anda bisa mencoba prosedur ini untuk meminta file cadangan log dan menemukan di mana file cadangan log nilai tertentu dari kolom tabel masih ada / terakhir hadir.
Untuk menemukan pengguna, setelah Anda menemukan dalam cadangan log apa nilai terakhir ada, Anda dapat mengembalikan database hingga cadangan log itu dan kemudian ikuti jawaban Mark Storey-Smith .
Beberapa prasyarat
Penolakan
Solusi ini jauh dari tahan air, dan masih banyak pekerjaan yang harus dilakukan.
Itu belum diuji pada lingkungan skala besar, atau bahkan lingkungan apa pun selain dari beberapa tes kecil. Jalankan saat ini pada SQL Server 2017.
Anda dapat menggunakan prosedur di bawah ini dari Muhammad Imran yang saya modifikasi untuk bekerja dengan isi cadangan log alih-alih isi dari log basis data langsung.
Dengan cara ini Anda secara teknis tidak melakukan pemulihan, tetapi membuang konten log dalam tabel sementara. Mungkin masih lambat, dan sangat terbuka untuk bug dan masalah. Tapi itu bisa berhasil, dalam teori ™.
Prosedur tersimpan menggunakan
fn_dump_dblog
fungsi tidak berdokumen untuk membacakan file log.Lingkungan pengujian
Pertimbangkan basis data ini, tempat kami memasukkan beberapa baris, ambil 2 cadangan log, dan pada cadangan log ketiga kami menghapus semua baris.
Prosedur
Anda dapat menemukan dan mengunduh prosedur tersimpan di sini .
Saya tidak dapat menambahkannya di sini karena lebih besar dari batas karakter, dan akan membuat jawaban ini lebih tidak jelas daripada sebelumnya.
Terlepas dari ini, Anda harus dapat menjalankan prosedur.
Menjalankan prosedur
Contoh dari ini, ketika saya menambahkan semua file log saya (
4
) ke prosedur tersimpan & menjalankan prosedur mencari value1Ini membuat saya:
Di mana kami dapat menemukan kapan operasi terakhir
value1
terjadi, penghapusan dalamlog3.trn
.Beberapa data uji lagi, menambahkan tabel dengan kolom berbeda
Mengubah nama file log & menjalankan prosedur lagi
Hasil
Jalankan baru, mencari integer (
2
) dival3
kolomdbo.WrongDeletes2
Hasil
Menerapkan jawaban Mark Storey-Smith
Kita tahu sekarang bahwa itu terjadi pada file log ketiga, mari kita pulihkan sampai titik itu:
Menjalankan kueri terakhir dalam jawabannya
Hasil untuk saya (sysadmin)
sumber