2011-10-24 32 views
6

Tôi cần một cách để kiểm tra khi ai đó cố gắng BẬT hoặc BẬT một trình kích hoạt trong cơ sở dữ liệu của chúng tôi. Giải pháp thay thế DDL kích hoạt hoạt động tuyệt vời nhưng chỉ trong các điều kiện để khi người dùng sử dụngKiểm tra các trình kích hoạt DISABLE/ENABLE IN SQL

ALTER TABLE <tableName> ENABLE TRIGGER <triggerName> 

HOẶC

ALTER TABLE <tableName> DISABLE TRIGGER <triggerName> 

tuyên bố. Từ những gì tôi đã xác định, phương pháp DDL làm cho vô dụng nếu người dùng thực hiện các báo cáo sau đó bỏ qua lệnh ALTER:

DISABLE TRIGGER <triggerName> ON <tableName> 
ENABLE TRIGGER <triggerName> ON <tableName> 

Tôi đã có một vài suy nghĩ về chụp những sự kiện không ai trong số họ làm việc. Một trong số đó là nếu tôi có thể truy cập vào bảng bên dưới chế độ xem sys.triggers, tôi có thể đặt trình kích hoạt chèn/cập nhật trên bảng đó và lọc tên trình kích hoạt để có được kiểm toán; nhưng sự nghi ngờ của tôi là nó có thể sẽ dẫn đến một sự đệ quy vô hạn ngay cả khi nó có thể làm được.

Có ai ở đây có bất kỳ đề xuất nào có thể cho các giải pháp thay thế cho vấn đề này không? Tôi không hiểu tại sao MS sẽ cho phép các phiên bản nâng cao của báo cáo để thoát khỏi phạm vi kiểm toán. Đó là, kiểm toán từ các phương pháp đơn giản nhất; bằng cách sử dụng SQL profiler có vẻ là chi phí không cần thiết cho việc này.

+0

Wow - bạn đang nói rằng cú pháp ENABLE TRIGGER ... ON ... bỏ qua SQL 2008 DDL Audit? http://msdn.microsoft.com/en-us/library/dd392015(v=sql.100).aspx – StuartLC

+0

Chỉ các trình kích hoạt DML có lẽ là nếu ai đó có thể vô hiệu hóa trình kích hoạt DDL, chúng cũng có thể vô hiệu hóa trình kích hoạt kiểm tra của bạn? Điều này được ghi lại trong dấu vết mặc định mà tôi nghĩ. –

+0

Có, nếu ai đó vô hiệu hóa trình kích hoạt DML của tôi bằng cú pháp DISABLE TRIGGER ON thì tôi sẽ không có cách nào để nắm bắt sự kiện đó qua trình kích hoạt DDL. – Mark

Trả lời

5

Trước tiên tôi sẽ giải quyết vấn đề này thông qua các quyền. Không ai ngoại trừ một vài dbas nên có thay đổi quyền truy cập bảng trên prod và do đó không thể sử dụng kích hoạt hoặc vô hiệu hóa kích hoạt. Nếu một ứng dụng đang sử dụng nó, điều đó sẽ dừng nó lại. Không có lý do gì cho bất kỳ người dùng nào cần phải thay đổi bảng. Nếu bạn muốn làm điều đó, bạn có một lỗ hổng thiết kế. Nếu bạn có người kích hoạt vô hiệu hóa các trình kích hoạt, bạn chắc chắn có lỗi thiết kế. Bất kỳ mã nào có trình kích hoạt vô hiệu hóa trong đó phải là một cờ đỏ lớn trong khi xem xét mã. Không được chấp nhận để vô hiệu hóa trình kích hoạt trong mã ứng dụng. Đây là cái gì đó chỉ nên được thực hiện bởi các dbas, những người có kinh nghiệm để biết khi nào cần làm. Nếu bạn đang viết mã ứng dụng và dường như cần vô hiệu hóa trình kích hoạt để mã của bạn hoạt động thì mã của bạn không chính xác hoặc trình kích hoạt cần phải được viết lại, trình kích hoạt tắt sẽ chỉ xảy ra trong trường hợp hiếm nhất.

+0

Tôi ước tôi có thể upvote một lần nữa. SQL không bị hỏng vì bạn không thể kiểm toán những người tắt trình kích hoạt, chính sách bị hỏng vì những người không đáng tin cậy có quá nhiều quyền lực. –

+0

Mặc dù mọi người đều có quyền được hưởng ý kiến ​​riêng của họ và tôi cũng đồng ý rằng việc quản trị hệ thống cũng quan trọng không kém; Tôi mạnh mẽ không đồng ý rằng không có khả năng kiểm tra loại sự kiện này không phải là một lỗ hổng. Nói rằng điều đó có nghĩa là khả năng kiểm tra sự kiện giống hệt nhau, với cú pháp khác nhau là sự sang trọng trái ngược với một công cụ bảo mật. Nếu không, tại sao không đơn giản loại bỏ việc kiểm tra các trigger từ mô hình DDL hoàn toàn? Một khía cạnh khác cho điều này là nó có thể là một lỗ hổng đối với các chính sách quản trị hay không; biết ai đang thực hiện các sự kiện trên hệ thống của bạn một cách bắt buộc. – Mark

+0

Tôi đồng ý đó là một lỗ hổng, nhưng cho phép mọi người có quyền làm những việc như vậy là một lỗ hổng lớn hơn. – HLGEM

Các vấn đề liên quan