Khi nào một kích hoạt bảng bị vô hiệu hóa và kích hoạt lại?


7

Tôi cần biết nếu lịch sử bật / tắt của trình kích hoạt bảng được theo dõi nguyên bản bởi SQL Server.

Tôi đã xem lại các chế độ xem hệ thống:
• [sys]. [Trình kích hoạt] chứa trường redirect_date
• [sys]. [Trigger_events] tập trung vào trình kích hoạt sự kiện INSERT / UPDATE / DELETE

Bạn có thể giới thiệu bất kỳ nguồn thông tin khác về lịch sử kích hoạt?

Câu trả lời:


10

SQL Server không theo dõi thông tin này (tôi dự kiến ​​sẽ thấy nó trong theo dõi mặc định, nhưng nó cũng không có ở đó). Bật / tắt sẽ cập nhật redirect_date, nhưng bạn sẽ không thể phân biệt điều đó với việc đổi tên hoặc sửa đổi mã. Ngoài ra, nó sẽ chỉ hiển thị cho bạn khi thay đổi cuối cùng diễn ra. Nếu bạn muốn bất kỳ theo dõi nào khác (chẳng hạn như ai đã thực hiện), bạn sẽ cần thực hiện kiểm toán hoặc theo dõi. Tôi nghĩ có lẽ cũng có thể sử dụng trình kích hoạt DDL, nhưng điều này có vẻ như là một lỗ hổng chức năng có chủ ý:

http://connect.microsoft.com/QueryServer/feedback/details/509242/fire-a-ddl-trigger-when-the-new-syntax-disable-trigger-is-executed

https://connect.microsoft.com/QueryServer/feedback/details/434951/ddl-trigger-still-not-usiness-disable-trigger-is-this-not-an-event

Đây là cách bạn có thể nắm bắt thông tin này trong tương lai bằng cách sử dụng kiểm toán:

USE master;
GO

CREATE SERVER AUDIT MyAudit 
  TO FILE (FILEPATH = 'C:\temp\', MAXSIZE = 1 GB) 
  WITH (ON_FAILURE = CONTINUE); 
GO

ALTER SERVER AUDIT MyAudit WITH (STATE = ON); 
GO

USE [your_database];
GO

CREATE DATABASE AUDIT SPECIFICATION schema_db_change 
  FOR SERVER AUDIT MyAudit 
  ADD (SCHEMA_OBJECT_CHANGE_GROUP), 
  ADD (DATABASE_OBJECT_CHANGE_GROUP);

ALTER DATABASE AUDIT SPECIFICATION schema_db_change WITH (STATE = ON); 
GO

Bây giờ đi và vô hiệu hóa kích hoạt của bạn, và sau đó chạy:

SELECT event_time, succeeded, server_principal_name, [object_name], [statement] 
FROM sys.fn_get_audit_file ('C:\Temp\MyAudit*', NULL, NULL);

Nếu bạn không thể sử dụng kiểm toán do phiên bản hoặc các vấn đề khác, bạn có thể thực hiện việc này tương đối rẻ tiền bằng cách sử dụng theo dõi phía máy chủ. Chỉ cần chụp SQL:BatchCompletedvà tùy chọn bộ lọc TextData LIKE '%disable%trigger%'(Bạn sẽ phải kiểm tra xem kịch bản của mình có tốt hơn để trả chi phí cho bộ lọc để tránh thu thập quá nhiều hay chỉ thu thập thêm và giảm chi phí sau. Bộ lọc có thể khá tốn kém nhưng tùy thuộc vào trên hệ thống.)

Tôi chắc chắn cũng có một cách để làm điều này với các sự kiện mở rộng. Nhưng cả XE và kiểm toán đều yêu cầu 2008+ và bạn không chỉ định phiên bản ...

Tốt hơn nữa, loại bỏ khả năng sửa đổi kích hoạt cho người dùng bỏ qua quản lý thay đổi. Lý tưởng nhất, bạn sẽ có thể xác định ai đã kích hoạt hoặc vô hiệu hóa trình kích hoạt mà không cần nhìn vào cơ sở dữ liệu, bởi vì không ai nên làm điều đó mà không cần ghi lại.


6

Hiện tại, chỉ có SQL Server Enterprise Edition và SQL Server Developer Edition hỗ trợ tính năng Audit để theo dõi bật và tắt kích hoạt Để nắm bắt các sự kiện này, trước tiên bạn cần tạo một đặc tả kiểm toán Máy chủ - đối tượng Kiểm toán SQL Server thu thập máy chủ hoặc cơ sở dữ liệu- hành động cấp và nhóm hành động:

USE master;
GO
CREATE SERVER AUDIT ServerAudit
TO FILE (FILEPATH = 'c:\audits\', MAXSIZE = 2 GB)
WITH (ON_FAILURE = CONTINUE);
GO
ALTER SERVER AUDIT ServerAudit
WITH (STATE = ON);

Bước tiếp theo là tạo ra một đặc tả kiểm toán cơ sở dữ liệu ở cấp cơ sở dữ liệu. Nhóm kiểm toán mà chúng tôi cần nắm bắt trong trường hợp của chúng tôi là SCHema_OB DỰ_CHANGE_GROUP - không có nhóm kiểm toán nào nắm bắt riêng các sự kiện kích hoạt / vô hiệu hóa

USE [ACMEDB];
GO
CREATE DATABASE AUDIT SPECIFICATION schema_change
FOR SERVER AUDIT ServerAudit
ADD (SCHEMA_OBJECT_CHANGE_GROUP)
WITH (STATE = ON);
GO

Truy vấn kiểm toán đã tạo trước đó, bằng cách sử dụng toán tử THÍCH để thu hẹp các mục đã bắt vào các mục liên quan đến bật / tắt kích hoạt:

SELECT
       event_time AS [Time],
       server_principal_name AS [User],
       object_name AS [Object name],
       Statement
  FROM sys.fn_get_audit_file('c:\audits\ServerAudit*', NULL, NULL)
WHERE
       database_name
       =
       'ACMEDB'
   AND (
       Statement LIKE '%DISABLE%TRIGGER%'
    OR Statement LIKE '%ENABLE%TRIGGER%')ORDER BY
                                          [Time] DESC;

Kết quả sẽ hiển thị ai đã tắt / kích hoạt trình kích hoạt và khi nào

nhập mô tả hình ảnh ở đây Mặc dù giải pháp mà chúng tôi mô tả chỉ áp dụng cho người dùng SQL Server Enterprise Edition và SQL Server Developer Edition, Kiểm toán cơ sở dữ liệu SQL Server khá đơn giản để thực hiện và có thể giúp theo dõi khi kích hoạt / tắt kích hoạt

Tuy nhiên, thông tin kiểm toán về việc kích hoạt / vô hiệu hóa kích hoạt có thể được nắm bắt ngay cả đối với các hoạt động được thực hiện trước khi "kiểm toán" được cài đặt . Bạn có thể đọc thêm về điều này trong Cách kiểm toán kiểm toán của bạn - theo dõi khi kích hoạt bài viết trực tuyến bị vô hiệu hóa

Tuyên bố miễn trừ trách nhiệm: Tôi làm Kỹ sư hỗ trợ sản phẩm tại ApexSQL


-1

Hoạt động như vậy có thể sẽ được ghi lại trong theo dõi hành chính mặc định . Liên kết chứa các hướng dẫn làm thế nào để xem nó.

Nếu nó được lưu trữ ở vị trí mặc định, bạn có thể sử dụng:

SELECT * 
FROM fn_trace_gettable
('C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\LOG\log.trc', default)
GO

Nó không có trong dấu vết mặc định, không.
Aaron Bertrand
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.