Tìm cách xóa hoặc cập nhật hồ sơ


7

Tôi đã có ba sự cố trong những tháng gần đây khi các bản ghi trong một bảng đã bị xóa hoặc các giá trị được cập nhật về 0 trên toàn bộ bảng. Chúng tôi có một nhóm bốn người có quyền và người chịu trách nhiệm cập nhật cơ sở dữ liệu những người có thể đã làm điều này. Thất vọng không ai thừa nhận để thực hiện các thay đổi.

Đi về phía trước tôi muốn có thể có một hồ sơ về các giao dịch này. Tôi đã tự hỏi những gì người khác sử dụng để theo dõi những thay đổi này? Họ có sử dụng phần mềm theo dõi các thay đổi hoặc bạn tạo các thủ tục được lưu trữ hoặc theo dõi các tệp? Nếu bất cứ ai có thiết lập này tại cơ sở của họ, tôi muốn biết những gì họ sử dụng. Các tệp theo dõi có thông tin tôi đang theo dõi như số máy đăng nhập tên và câu lệnh sql vì vậy nó sẽ cung cấp cho tôi thông tin nếu tôi thiết lập trước.

Tôi có các bản sao của cơ sở dữ liệu và nhật ký giao dịch khi những thay đổi này diễn ra. Có bất cứ điều gì tôi có thể làm với các tập tin cũ này để giúp truy tìm thủ phạm? Cảm ơn trước cho bất cứ ai trả lời. Chúng tôi đang sử dụng máy chủ SQL 2005.


1
Vui lòng chỉ sử dụng trang web meta (meta.dba.stackexchange.com) để thảo luận về chính trang web đó. Bất kỳ câu hỏi cơ sở dữ liệu kỹ thuật cần phải đến trang web chính.
JNK

Bạn có biết khi nào sự thay đổi diễn ra không?
swasheck

2
Paul Randal đã giúp viết fn_dblog có thể giúp bạn. sqlskills.com/bloss/paul/post/ từ
swasheck

Bạn có biết khi nào nó xảy ra không? Điều đó sẽ giúp rất nhiều. Chúng tôi có thể khôi phục kịp thời để có được khoảnh khắc nó xảy ra, sau đó xem qua nhật ký giao dịch sẽ dễ dàng hơn rất nhiều, nhưng tôi không nghĩ rằng nó ghi lại tên máy chủ lưu trữ. Bạn có thể nhìn vào dấu vết mặc định của mình nếu nó vẫn có thông tin để tìm tên máy chủ thực hiện thao tác. Theo dõi mặc định sẽ cho bạn biết loại hoạt động nếu họ có quyền sysadmin.
Ali Razeghi

1
Tôi có một đoạn script được đăng trên blog của mình có tên là Dump Transaction Log Backup sử dụng fn_dump_dblog- thực tế tôi đã phải sử dụng nó ngay hôm nay tại nơi làm việc. Đầu ra của tập lệnh của tôi được tinh chỉnh hơn các truy vấn trong bài của Paul Randal, về cơ bản chỉ thể hiện chức năng này làm gì. Chỉnh sửa: tuy nhiên, bạn sẽ cần sửa đổi một chút để làm việc với cú pháp năm 2005. Lấy làm tiếc.
Jon Seigel

Câu trả lời:


5

fn_dblog là cách để nhìn về phía sau như các nhà bình luận khác đã nói.

Chỉ cho phép người dùng sửa đổi dữ liệu thông qua các quy trình được lưu trữ là một cách tuyệt vời để ngăn chặn điều này xảy ra ngay từ đầu, vì bạn có thể thêm logic để ngăn người dùng sửa đổi hàng loạt hồ sơ họ không nên hoặc đảm bảo rằng họ phải cung cấp giá trị chính xác để cập nhật. Điều này có thể có nghĩa là bạn cần thực hiện thay đổi ứng dụng tùy thuộc vào cách họ hiện đang truy cập dữ liệu. Mà có thể hoặc không thể cho bạn.

Nếu bạn không thể làm điều đó, thì một cách nhanh chóng và đơn giản với SQL 2005 sẽ là sử dụng một trình kích hoạt để thực hiện một số kiểm tra DML ở cấp độ bảng. (SQL Server 2008 trở đi có các công cụ kiểm toán tích hợp).

Một giải pháp đơn giản cho vấn đề của bạn có thể là:


drop table audit_test
go
create table audit
(
uname varchar(50),
[date] datetime,
what nvarchar(4000),
host varchar(50),
)
go 

create trigger ddlcheck on tbl_example 
for update, delete
as
declare @tbltmp table(eventtype nvarchar(30),para smallint, strsql nvarchar(4000))
insert into @tbltmp exec ('dbcc inputbuffer('+@@spid+')')
insert into audit_test select SUSER_NAME(), GETDATE(),  strsql ,  HOST_NAME() from @tbltmp

Điều này sẽ kích hoạt bất cứ khi nào một truy vấn cố gắng cập nhật bảng hoặc xóa khỏi bảng. Nó sử dụng DBCC inputbuffer( http://msdn.microsoft.com/en-us/l Library / ms187730 ( v = sql.90 ) .aspx ) để nhận lệnh đã ban hành. Điều này cung cấp cho bạn một bảng được điền với tất cả các báo cáo cập nhật và xóa đối với một bảng cụ thể. Thêm vào đó, nó ghi lại những người đã đưa ra tuyên bố, và nó ở đâu và khi nào.

Bây giờ, đây có thể là rất nhiều dữ liệu ghi nhật ký trên một bảng bận rộn, vì vậy điều này có thể bị hạn chế chỉ bắt các truy vấn 'xấu' (giả sử những truy cập cập nhật / xóa hơn 1000 hàng) bằng cách thay đổi trình kích hoạt thành:


create trigger ddlcheck on tbl_example 
for update, delete
as
declare @cnt integer
select @cnt=count(1) from deleted
if @cnt>1000
begin
  declare @tbltmp table(eventtype nvarchar(30),para smallint, strsql nvarchar(4000))
  insert into @tbltmp exec ('dbcc inputbuffer('+@@spid+')')
  insert into audit_test select SUSER_NAME(), GETDATE(),  strsql ,  HOST_NAME() from @tbltmp
end

Điều này ghi lại ít dữ liệu hơn, nhưng trình kích hoạt vẫn cần 'đánh giá' cho mọi hoạt động, do đó có thể có tác động hiệu suất cần được đo lường và kiểm tra. Điều này cũng sẽ bỏ lỡ các hành động nếu người dùng gửi nhiều câu lệnh riêng lẻ, nghĩa là;

sẽ không bắt:


delete from tbl_example where id=1
delete from tbl_example where id=2
.....
delete from tbl_exampe where id=1000

Sẽ bắt


delete from tbl_example where id>0 and id<1001

Hy vọng đây là một số trợ giúp cho tương lai.


Cảm ơn tất cả những kẻ có ý kiến! Vâng, tôi biết đại khái khi những thay đổi được thực hiện. Tôi đã thu hẹp nó xuống một khung thời gian khoảng nửa giờ.
kdis

1

Chúng tôi sử dụng ApexSQL Log để kiểm tra cơ sở dữ liệu sản xuất của chúng tôi. Nó có thể cho bạn thấy ai và khi nào đã xóa hoặc cập nhật các hồ sơ. Nó cũng theo dõi các phần chèn và tạo / thay đổi / thả câu lệnh cho các đối tượng dữ liệu.

Thật tốt khi bạn có các bản sao của cơ sở dữ liệu và nhật ký giao dịch khi những thay đổi này diễn ra, vì Nhật ký ApexQuery có thể đọc các giao dịch này từ nhật ký giao dịch. Nếu bạn dự định sử dụng nó để theo dõi các thay đổi trong tương lai, cơ sở dữ liệu của bạn phải ở trong mô hình khôi phục hoàn toàn, vì chỉ khi đó bạn mới có thể chắc chắn rằng nhật ký giao dịch trực tuyến hoặc bản sao lưu nhật ký giao dịch có chứa tất cả các giao dịch bạn muốn đọc. Chúng tôi nén sao lưu nhật ký giao dịch của mình để tiết kiệm dung lượng

Chúng tôi có một công việc hàng đêm được lên lịch để đọc các bản sao lưu nhật ký giao dịch trong 24 giờ qua và xuất các giao dịch thành một tệp HTML. Nếu chúng tôi cần bất kỳ thông tin nào, tôi sẽ kiểm tra tệp và đừng lo lắng nếu sao lưu nhật ký giao dịch bị xóa (chúng tôi sẽ xóa chúng sau 30 ngày)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.