Martin sudah menunjuk jalan terbaik, jejak audit administrasi yang biasanya aktif (kecuali jika telah dinonaktifkan secara eksplisit). Jika Anda tidak dapat menemukan info dalam jejak admin (dinonaktifkan atau telah didaur ulang), Anda dapat mengambil info dari cadangan log. Karena ini adalah DB produksi, saya menganggap Anda memiliki siklus cadangan reguler, dengan cadangan penuh berkala dan cadangan log. Anda harus mengembalikan, pada server yang terpisah, ke database sekitar waktu kejadian sehingga DDL berada di log yang dipulihkan saat ini. Kemudian adalah masalah sederhana menggunakan fn_dblog()
dan memeriksa log.
Salah satu caranya adalah dengan memulai operasi transaksi:
select [Begin Time], [Transaction Name], [Transaction SID], *
from fn_dblog(null, null)
where Operation = 'LOP_BEGIN_XACT';
Jika ALTER VIEW
dikeluarkan dalam transaksi mandiri (mis. Tidak dikelilingi oleh BEGIN TRANSACTION
/ COMMIT
) maka akan memulai transaksi bernama CreatProc transaction
. Carilah itu, dan [Transaction SID]
SID login yang Anda inginkan.
Kemungkinan lain adalah mencari transaksi yang memperoleh SCH_M pada tampilan yang Anda inginkan:
select [Lock Information], *
from fn_dblog(null, null)
where [Lock Information] like '%' + cast(object_id('...') as varchar(10))+'%'
and [Lock Information] like '%LOCK_SCH_M%'
go
Perhatikan bahwa jika tampilan diubah oleh DROP diikuti oleh CREATE id objek kemungkinan berubah, tetapi setidaknya Anda akan mendapatkan transaksi yang terakhir melakukan CREATE (id objek saat ini dari tampilan di db yang dipulihkan). Dengan id transaksi Anda kembali dan mengambil info transaksi awal:
select [Begin Time], [Transaction Name], [Transaction SID], *
from fn_dblog(null, null)
where [Transaction ID] = '...'
and Operation = 'LOP_BEGIN_XACT';
[SID Transaksi] sekali lagi adalah cowok Anda. Gunakan SUSER_SNAME
untuk mengambil nama login dari SID login. Jika SID adalah 0x01 itu berarti login itu sa
, yang berarti setiap orang yang tahu sa
kata sandi bisa melakukannya.