Làm cách nào để tôi tạo người dùng cho SQL Server có truy vấn (bất kỳ / tất cả) bị giới hạn thời gian?


7

Có cách nào để tạo người dùng cơ sở dữ liệu trong SQL Server 2005 để không có truy vấn nào của họ được phép vượt quá giới hạn thời gian nhất định (ví dụ: 20-30 giây) hoặc tất cả các truy vấn được giới hạn trong một số chu kỳ nhất định - và sau đó hết thời gian truy vấn - tức là ngăn người dùng này thực sự sử dụng hết tài nguyên quan trọng cho mỗi truy vấn?

Bất cứ ai cũng biết một cách để làm điều này?

cảm ơn bạn!


Khi bạn nói "người dùng", bạn có nghĩa là kiểm soát tài nguyên cho người dùng cơ sở dữ liệu cụ thể hoặc đăng nhập máy chủ?
Jon Seigel

cho một người dùng cơ sở dữ liệu nhất định
Faisal Vali

Bạn có nghĩa là bởi KẾT NỐI?
JNK

Tôi đã nghĩ đến bất kỳ kết nối nào bằng cách sử dụng thông tin đăng nhập db đó - nhưng nếu bạn có một phương pháp để giới hạn nó dựa trên ip mà truy vấn đang đến - điều đó cũng hữu ích -
Faisal Vali

Câu trả lời:


4

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 đề ...


1
Bạn không thể đặt query_governor_cost_limitthay mặt người dùng trong trình kích hoạt đăng nhập (thực ra, bạn có thể, nhưng cài đặt hoạt động trong vòng đời của trình kích hoạt, chứ không phải phiên người dùng như người ta có thể nghĩ). Ngoài ra, điều quan trọng cần lưu ý query governor cost limitlà một tùy chọn nâng cao, vì vậy trước tiên bạn nên chạy exec sp_configure 'show advanced options', 1để có thể thay đổi tùy chọn này.
Diego Queiroz

1

Tôi e rằng không thể đặt giới hạn trong trình kích hoạt đăng nhập. Sử dụng SET trong trình kích hoạt đăng nhập là vô ích vì lệnh SET chỉ hoạt động trong ngữ cảnh của trình kích hoạt (tức là từ lệnh đến câu lệnh END). Ngay sau khi phiên kết thúc thực hiện kích hoạt, giá trị được đặt lại về giá trị ban đầu.


0

Tôi nghĩ bạn nên kiểm soát điều đó từ quan điểm của DAL (Lớp truy cập dữ liệu). Đặt thời gian chờ ở đó. Ví dụ: đối với ADO.NET, bạn có thể đặt thời gian chờ tại Lệnh, khác nhau cho mỗi người dùng.

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.