Apakah ada untuk menentukan siapa yang menjatuhkan meja?

8

Tabel dalam database produksi telah 'menghilang' secara misterius.

Adakah yang tahu cara untuk mendiagnosis apa yang terjadi padanya? Dan siapa yang melakukannya?

Sunting 1: Ini adalah aplikasi internal, dengan keamanan yang lemah. Semua aplikasi (kecuali milik saya tentu saja ;-) rentan terhadap SQL Injection, tetapi pengguna kami sangat tidak canggih dan nama tabel bukan salah satu yang mungkin langsung jelas, jadi saya tidak berpikir itu adalah Injeksi SQL (tidak itu penting ... semacam di luar lingkup pertanyaan).

Sunting 2: Juga, hanya FYI; tabel ini sudah ada sejak lama, jadi itu tidak 'dibatalkan' dengan pemulihan.

John MacIntyre
sumber
Maksudmu hantu "Bukan Aku" juga menangkapmu?
Nick DeVore
apakah Anda memiliki akun basis data terpisah untuk semua orang atau apakah semua orang masuk sebagai 'dba' atau sesuatu yang setara?
@ Zerofiz-Kami menggunakan Windows Integrated Security, jadi ya setiap pengguna dapat diidentifikasi.
John MacIntyre
Saya menemukan blog ini yang menjelaskan proses langkah demi langkah untuk menentukan siapa yang menjatuhkan tabel dbarepublic.com/2015/01/who-dropped-table.html .

Jawaban:

14

Anda mungkin bisa mengeluarkan info dari log menggunakan fungsi :: fn_dblog yang tidak didokumentasikan yang menginterpretasikan catatan log. Saya sedang mengajar kelas pemulihan bencana sekarang, tetapi jika Anda bisa menunggu 2-3 jam saya akan memposting cara melakukannya untuk Anda - harus bisa mendapatkan nama pengguna juga tanpa harus membeli alat apa pun ( Saya digunakan untuk spelunk sekitar log satu ton pada tahun 2000 ketika saya menulis banyak kode analisis log internal yang menggunakan DBCC CHECKDB pada tahun 2000).

[Diedit untuk memasukkan instruksi]. Ok - selesai mengajar dan saya mengetuk sebuah posting blog untuk menunjukkan kepada Anda bagaimana menganalisis log pada tahun 2000, 2005, 2008 untuk mengetahui kapan tabel itu dijatuhkan dan siapa yang melakukannya. Lihat pos blog saya di Mencari tahu siapa yang menjatuhkan meja menggunakan log transaksi . [/ edit]

Apakah Anda masih memiliki log transaksi? Model pemulihan mana yang menjadi basis data? Jika SIMPLE, jangan lakukan apa pun yang akan menyebabkan pos pemeriksaan. Jika FULL atau BULK_LOGGED, jangan lakukan pencadangan log. Salah satu dari ini akan menyebabkan log terpotong dan kemudian Anda mungkin kehilangan kemampuan untuk melihat kembali log, meskipun saya menyertakan tanda jejak di posting blog yang dapat membantu Anda dengan itu juga.

Terima kasih

PS Salah satu cara mencegah penurunan tabel pada tahun 2000 tanpa menambah keamanan adalah dengan membuat tampilan schemabound sederhana di atasnya - DROP TABLE akan gagal jika tampilan ada.

Paul Randal
sumber
Terima kasih Paul, itu saran yang bagus. Saya bisa menunggu. Saya pergi sekarang, dan pergi ke klien lain besok, jadi saya akan mencoba mencari tahu apa yang terjadi pada hari Kamis. Saya akan memberi tahu admin tentang cadangan log.
John MacIntyre
8

Mungkin itu Little Bobby Tables ...

Michael Borgwardt
sumber
1
Bagus :) Akan memberi ini +1 untuk humor tapi itu akan konyol karena satu-satunya jawaban lain memiliki 1 suara juga.
2
Nah, itu cukup lucu untuk sebuah upvote.
Electrons_Ahoy
2

Anda mungkin dapat memulihkan informasi ini dari log SQL.

RSolberg
sumber
Saya tahu informasi ini ada di log SQLServer, tapi saya pikir Anda tidak bisa membaca apa pun dari mereka. Saya ingin mengetahui Anda bisa. Adakah yang tahu?
John MacIntyre
Im hanya akrab dengan Sybase SQL Anywhere, tetapi mereka memiliki utilitas untuk menerjemahkan file log ke dalam laporan SQL ...
1
Alat ini mungkin dapat membantu Anda membaca log. red-gate.com/products/SQL_Log_Rescue/index.htm
RSolberg
+1 untuk tautan alat log. Mengapa Anda tidak menjawabnya?
John MacIntyre
2

Jika log penelusuran default sedang berjalan, semua info disimpan di folder log. Anda harus dapat melihat kapan objek (tabel) terjatuh dan koneksi mana yang melakukannya. Tetapi jenis izin ini seharusnya hanya diberikan kepada DBA saja

TStamper
sumber
2

Saya mencoba untuk memperbaiki MSDB yang rusak. Maaf saya tidak bisa menguraikan.

Jalankan ini dan itu akan memberikan ide umum ke mana harus mencari, dengan asumsi jejak default Anda aktif.

SELECT * FROM :: fn_trace_getinfo (default)

PILIH t.EventID, t.ColumnID, e.name sebagai Event_Description, c.name sebagai Column_Description FROM :: fn_trace_geteventinfo (1) t BERGABUNG sys.trace_events e ON t.eventID = e.trace_event_id JOIN sys.trace_umn = c.trace_column_id


sumber
Terima kasih, saya pikir sys. * Tables 2005 tetapi bukan? Apakah ada 2000 yang setara?
John MacIntyre
2

Satu-satunya cara untuk mengetahui info ini adalah dengan membaca log transaksi (dengan asumsi itu dalam mode pemulihan penuh).

Dua cara untuk melakukan ini:

  • Alat pihak ketiga seperti ApexSQL Log atau SQL Log Rescue (gratis tetapi hanya sql 2000)
  • Menggunakan perintah seperti DBCC LOG atau fn_dblog - sayangnya tidak ada yang terdokumentasi dengan baik
Anthony Horovitz
sumber
2

Dalam SSMS Anda dapat mencoba mengklik kanan pada dB dan menavigasi melalui Laporan -> Laporan Standar -> Schema Changes History.

Klik kanan pada laporan dan 'SaveAs' Excel dan temukan nama objek Anda.

Anda tidak akan bisa mendapatkan apa pun jika server telah di-restart lebih dari lima kali setelah objek dijatuhkan.

pengguna204862
sumber
Melihat log gagal untuk saya. Sebagian besar dikuasai karena tingginya jumlah transaksi dalam sistem kami. Metode Anda bekerja dengan sempurna. Terima kasih telah berbagi!
tylerjgarland