Martin đã chỉ ra con đường tốt nhất, dấu vết kiểm toán hành chính thường được bật (trừ khi nó đã bị vô hiệu hóa rõ ràng). Nếu bạn không thể tìm thấy thông tin trong theo dõi quản trị viên (đã bị vô hiệu hóa hoặc nó đã được tái chế), bạn có thể truy xuất thông tin từ bản sao lưu nhật ký. Vì là DB sản xuất, tôi giả sử bạn có một chu kỳ sao lưu thường xuyên, với sao lưu toàn bộ và sao lưu nhật ký. Bạn sẽ cần khôi phục, trên một máy chủ riêng biệt, cơ sở dữ liệu vào khoảng thời gian xảy ra sự cố để DDL nằm trong nhật ký được khôi phục hiện tại. Sau đó là một vấn đề đơn giản của việc sử dụng fn_dblog()
và kiểm tra nhật ký.
Một cách là đi bằng giao dịch bắt đầu hoạt động:
select [Begin Time], [Transaction Name], [Transaction SID], *
from fn_dblog(null, null)
where Operation = 'LOP_BEGIN_XACT';
Nếu ALTER VIEW
được phát hành trong một giao dịch độc lập (nghĩa là không được bao quanh bởi BEGIN TRANSACTION
/ COMMIT
) thì nó sẽ bắt đầu một giao dịch có tên CreatProc transaction
. Hãy tìm nó và [Transaction SID]
SID đăng nhập bạn muốn.
Một khả năng khác là tìm kiếm giao dịch có được SCH_M theo quan điểm bạn muốn:
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
Lưu ý rằng nếu chế độ xem được thay đổi bởi DROP, theo sau là CREATE thì id đối tượng có thể đã thay đổi, nhưng ít nhất bạn sẽ nhận được giao dịch đã thực hiện CREATE (id đối tượng hiện tại của chế độ xem trong db được khôi phục). Với id giao dịch, bạn quay lại và lấy thông tin giao dịch bắt đầu:
select [Begin Time], [Transaction Name], [Transaction SID], *
from fn_dblog(null, null)
where [Transaction ID] = '...'
and Operation = 'LOP_BEGIN_XACT';
[SID giao dịch], một lần nữa, là chàng trai của bạn. Sử dụng SUSER_SNAME
để lấy tên đăng nhập từ SID đăng nhập. Nếu SID là 0x01, điều đó có nghĩa là đăng nhập sa
, có nghĩa là bất kỳ cá nhân nào biết sa
mật khẩu có thể đã thực hiện.