Xác định cách thay đổi lược đồ xảy ra?


21

Một cái gì đó tồi tệ đã xảy ra ngày hôm qua.

Một khung nhìn được tạo ra trước đây đã được sửa đổi bởi một người cuối cùng đã phá vỡ các báo cáo. Không may. ai đó (cố ý hoặc vô tình) đã thực hiện sửa đổi này trong cơ sở dữ liệu SẢN XUẤT.

Câu hỏi của tôi: Có cách nào (script / phần mềm / phần mềm miễn phí, v.v.) mà chúng ta có thể biết ai (tên người dùng) đã thực hiện sửa đổi này, để tôi có thể thu hồi quyền truy cập vào cơ sở dữ liệu sản xuất cho người dùng đó.

Nếu câu hỏi của tôi không rõ ràng, xin vui lòng bình luận.

Câu trả lời:


36

Điều này được ghi vào dấu vết mặc định, miễn là nó được kích hoạt và không bị lật trong khi đó nó sẽ xuất hiện trong báo cáo "Lịch sử thay đổi lược đồ".

Để truy cập cái này trong Management Studio, nhấp chuột phải vào cơ sở dữ liệu, sau đó từ menu ngữ cảnh, chọn Reports -> Standard Reports -> Schema Changes History

Để lấy thông tin tương tự qua TSQL, bạn có thể sử dụng

SELECT StartTime
       ,LoginName
       --,f.*
FROM   sys.traces t
       CROSS APPLY fn_trace_gettable(REVERSE(SUBSTRING(REVERSE(t.path),
                                                       CHARINDEX('\', REVERSE(t.path)), 
                                                       260)
                                             ) + N'log.trc', DEFAULT) f
WHERE  t.is_default = 1
       AND ObjectName = 'FOO'
       AND EventClass IN (46, /*Object:Created*/
                          47, /*Object:Dropped*/
                          164 /*Object:Altered*/ )

Cảm ơn Martin, tôi đã thực hiện truy vấn bằng cách thay thế 'FOO' bằng chế độ xem của mình nhưng điều đó không trả lại bất cứ điều gì. Bất cứ ý tưởng tại sao điều đó xảy ra? Tuy nhiên, tôi đã thực hiện không phải trên máy chủ
xorpower

1
@Xorpower - Tôi đã chỉnh sửa nó để xử lý Object:Createdsự kiện cũng như chế độ xem bị bỏ và tạo thay vì thay đổi. Không chắc chắn những gì bạn có nghĩa là không thực hiện trên máy chủ? Tất nhiên, bạn cần được kết nối với trường hợp chính xác nhưng không quan trọng kết nối đến từ đâu miễn là bạn có quyền.
Martin Smith

Cảm ơn martin, nhưng kết quả vẫn giữ nguyên
xorpower


3
@Xorpower - Có vẻ như dấu vết đã trôi qua và bạn đã mất thông tin chi tiết về bất cứ thứ gì cũ hơn khoảng 11 giờ. Theo dõi mặc định chỉ giữ 5 tệp và sau đó xóa các tệp cũ hơn. Bạn có thể muốn kiểm tra hệ thống tập tin trên máy chủ thư mục chỉ để kiểm tra xem đây có phải là trường hợp không. Bạn có thể lấy đường dẫn thư mục từSELECT path FROM sys.traces where is_default=1
Martin Smith

19

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 samật khẩu có thể đã thực hiện.


2
Mẹo hay về đọc các tệp nhật ký. Điều này có ích nếu ai đó vô hiệu hóa các dấu vết mặc định.
StanleyJohns

Điều gì xảy ra nếu SID giao dịch là null?
đuổi đi

@evictednoise xin vui lòng gửi các bản ghi nhật ký liên quan (trong một câu hỏi riêng). Có thể nhiều hơn một lý do và các bản ghi nhật ký sẽ giúp xác định nguyên nhân thực tế.
Remus Rusanu

6

Không, trừ khi bạn đăng nhập nó thông qua trình kích hoạt DDL hoặc như vậy

Bạn muốn xem ai là quyền ALTER trong cơ sở dữ liệu đó, hoặc là thành viên của vai trò sysadmin / db_owner / ddl_admin. Điều này sẽ tốt hơn khi xem xét chung hơn là săn phù thủy. Có lẽ có những người khác có quyền thực hiện các thay đổi không được chấp thuận và trái phép quá


0

Nếu bạn chưa có, bạn có thể muốn xem báo cáo Lịch sử thay đổi lược đồ có sẵn trong SQL Server Management Studio. Dường như SQL Server ghi lại các thay đổi theo mặc định ( theo dõi mặc định ) và bạn sẽ có thể xem dữ liệu đó qua báo cáo này. Điều đáng tiếc duy nhất là các tệp theo dõi này sẽ tự động bị xóa / cuộn khi thời gian trôi qua, do đó dữ liệu có thể đã biến mất. Chúc may mắn!


Rất tiếc, đừng bận tâm. Tôi thấy Martin Smith đã tham chiếu báo cáo này trong câu trả lời của mình. Tôi sẽ để nó ở đây mặc dù trong trường hợp bất kỳ liên kết nào là hữu ích.
Đánh dấu Madej
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.