Có nhiều cách, nhưng không có gì là hoàn hảo.
Nếu người dùng chỉ truy cập cơ sở dữ liệu SQL Server thông qua lớp dữ liệu (ví dụ: người dùng chỉ đi qua một ứng dụng web cụ thể và không kết nối bằng SQL Server Management Studio), câu trả lời của George Mavritsakis có thể hoạt động. Tuy nhiên, nếu họ kết nối qua SSMS, bạn phải tiến thêm một bước nữa.
Bạn có thể đặt query governor cost limit
(trong sp_configure
) thành một giới hạn thời gian cụ thể, nhưng điều đó ảnh hưởng đến tất cả người dùng theo mặc định. Điều này sẽ giết một truy vấn nếu thời gian dự kiến lớn hơn mức tối đa của bạn, lưu ý rằng thời gian dự kiến phụ thuộc vào số liệu thống kê và các truy vấn phức tạp hơn có thể làm hỏng tính toán của bạn.
Nếu bạn chỉ muốn làm điều này cho một lần đăng nhập, bạn có thể tạo trình kích hoạt đăng nhập và nếu thông tin đăng nhập đó là người dùng lãng phí tài nguyên của bạn, hãy chạy
SET QUERY_GOVERNOR_COST_LIMIT 600 --or whatever value you want
trong cơ thể kích hoạt. Một lần nữa lưu ý rằng thống đốc sử dụng thời gian ước tính thay vì thời gian thực tế , vì vậy nó không thể đánh lừa được. Tuy nhiên, điều đó sẽ ngăn chặn nỗ lực select *
chống lại bảng 10 triệu nếu đó là vấn đề thực sự bạn đang gặp phải.
Nhược điểm của việc tạo trình kích hoạt đăng nhập là bạn phải nhớ rằng nó ở đó. Giống như tất cả các loại kích hoạt khác, nó có thể dẫn đến hành vi "không mong muốn" nếu ai đó không biết về nó (ví dụ: sự thay thế cuối cùng của bạn) cố gắng tìm hiểu lý do tại sao người này liên tục nhận được thông báo lỗi lạ.
Lưu ý rằng trong các phiên bản gần đây hơn, Microsoft đã tránh xa người điều hành truy vấn, đặc biệt là khi họ đã chuyển sang người điều hành tài nguyên. Nhưng nó vẫn còn trong năm 2012 (và dường như không được phản đối) và nếu bạn bị mắc kẹt vào năm 2005, tôi đoán đó không phải là vấn đề ...